878. 線性同餘方程
阿新 • • 發佈:2020-09-21
\(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\)
給定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; }