同余方程
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同余的整数。