13.线性同余方程 扩展欧几里得算法

 

 扩展欧几里德算法的简单应用,就是求解线性同余方程

先把这个等式做变形

 只要保证b能整除a和m的最大公约数,即b是a和m最大公约数的倍数

 就有解

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll exgcd(ll a, ll b, ll &x, ll &y) {
 5     if (!b) {
 6         x = 1;
 7         y = 0;
 8         //x = 1, y = 0是一组解
 9         return a;
10     }
11     ll d = exgcd(b, a % b, y, x); //翻转一下
12     y -= a / b * x;
13     return d;
14 }
15 int main() {
16     ios::sync_with_stdio(false);
17     cin.tie(0);
18     cout.tie(0);
19     int n;
20     cin >> n;
21     while (n--) {
22         ll a, b, m;
23         cin >> a >> b >> m;
24         ll x, y;
25         ll d = exgcd(a, m, x, y);
26         if (b % d) {
27             cout << "impossible" << endl;
28         } else {
29             cout << x * (b / d) % m << endl;
30         }
31     }
32     return 0;
33 }
原文地址:https://www.cnblogs.com/fx1998/p/13443416.html