878. 线性同余方程
\(a*x \equiv b \ (mod \ m)\)
即存在\(y\)
使得\(a*x = m * y + b\)
即\(a*x -m*y=b\)
令\(y'= -y\)
有\(a*x + m*y'=b\)
\(a*x \equiv b \ (mod \ m)\)有解等价于\(a*x + m*y'=b\)有解
联想扩展欧几里得算法,若方程\(a*x + m*y'=b\)有解,那么b一定是\((a, m)\)的倍数,若不是,方程一定无解。
可以先用扩展欧几里得求出使得\(a*p + m*q= (a, m)\)的系数\(p, q\),那么求出\(x, y'\)只需要将\(p, q\)扩大\(b/(a, m)\)即可。
给定n组数据ai,bi,mi,对于每组数求出一个xi,使其满足ai∗xi≡bi(mod mi),如果无解则输出impossible。
#include<iostream>
using namespace std;
#define LL long long
int exgcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main(){
int T;
cin >> T;
while(T --){
int a, b, m;
cin >> a >> b >> m;
int x, y;
int d = exgcd(a, m, x, y);
if(b % d) puts("impossible");
else printf("%ld\n", (LL) x * (b / d) % m);
}
return 0;
}

浙公网安备 33010602011771号