擴充套件中國剩餘定理模板
阿新 • • 發佈:2018-12-14
設
使用擴充套件歐幾里得演算法求解 ,滿足
則有
對比可得
實際上有多組解
取 的最小整數解,
合併成了
對於有些題目,中間運算結果會爆long long。不要偷懶使用__int128,下面是錯誤示範 ,乖乖打龜速乘。(也不要手寫__int128)
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
LL a[100005],m[100005];
int n;
LL exgcd(LL a,LL b,LL &x,LL &y) {
if (b==0) {x=1,y=0;return a;}
LL d=exgcd(b,a%b,y,x);y-=(a/b)*x;
return d;
}
inline void excrt() {
LL M=1,A=0;
for (int i=1;i<=n;i++) {
LL x,y,d=exgcd(M,m[i],x,y),tmp=m[i]/d;
if ((a[i]-A)%d) {puts("No solution!");return;}
x=(x%tmp+tmp)%tmp;
LL k=(LL)((__int128)(a[i]-A)/d*x%tmp+tmp)%tmp;
LL nM=M*tmp;
A=(LL)((A+(__int128)k*M)%nM);
M=nM;
}
printf("%lld",A);
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%lld %lld",&m[i],&a[i]);
excrt();
return 0;
}