同余方程

NC229005 【模板】同余方程(https://ac.nowcoder.com/discuss/926597)

点击查看代码
#include <bits/stdc++.h>
using namespace std;

#define int long long

int exgcd(int a,int b, int &x, int &y)
{
    if(a<b) return exgcd(b,a,y,x);
    if(b==0){
        x = 1; y = 0;
        return a;
    }
    else{
        int x1;
        int d = exgcd(b,a%b,x1,x);
        y = x1 - a/b * x;
        return d;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    int t;cin >> t;
    while(t--)
    {
        int a,b;cin >> a >> b;
        int x,y;
        int m = exgcd(a,b,x,y);
        if(m!=1) cout << -1 << endl;
        else cout << (x % b + b) % b << endl;
    }

    return 0;
}


翡蜀定理 对任意的正整数a b,必然存在x y,使得ax+by=(a,b)
如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。

线性同余方程:
给定整数a,b,m,求一个整数满足:a*x≡b(mod m),或给出无解。
因为未知数的次数为1,称之为线性同余方程。
求解过程:
a*x≡b(mod m), 可得a*x+m*y=b 这个方程有解的条件是:
gcd(a,m)|b 接下来利用exgcd先求出一组特解x0,y0满足a*x0+m*y0=gcd(a,m),然后x=x0/gcd(a,m)*b就是线性同余方程的一个解。
方程的通解是模m/gcd(a,m)与x同余的整数。

posted @ 2022-07-10 10:25  HIVM  阅读(178)  评论(0编辑  收藏  举报