1. 程式人生 > 實用技巧 >878. 線性同餘方程

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;
}