扩展欧几里得算法
代码
typedef long long LL;
LL exgcd(int a, int b, int &x, int &y)
{
if (b == 0) {
x = 1, y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
线性同余方程
代码
// 求 ax≡b (mod m),最小非负整数 x
typedef long long LL;
LL x, y;
LL d = exgcd(a, m, x, y);
if (b % d == 0) {
x *= (b / d);
LL t = m / d;
printf("%d\n", (x % t + t) % t);
} else {
puts("impossible");
}