扩展欧几里德算法的简单应用,就是求解线性同余方程
先把这个等式做变形
只要保证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 }