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
", (LL) x * (b / d) % m);
    }

    return 0;
}