中国剩余定理
概念
cpp
int CRT(vector<int> &r,vector<int> &m){
__int128 n=1,ans=0;
for(auto &x:m)n*=x;
for(int i=0;i<r.size();i++){
int M=n/m[i],iM,y;
exgcd(M,m[i],iM,y);
(ans+=r[i]%n*M%n*iM%n)%=n;
}
return (ans%n+n)%n;
}拓展中国剩余定理
- 合并
cpp
int qmul(int a,int b,int mod){
int ans=0;
for(;b;b>>=1){
if(b&1)ans=(ans+a)%mod;
a=(a+a)%mod;
}
return ans;
}
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 exCRT(vector<int> &r,vector<int> &m){
int r1=r[0],m1=m[0];
int x,y;
for(int i=1;i<r.size();i++){
int r2=r[i],m2=m[i],res=((r2-r1)%m2+m2)%m2;
int gcd=exgcd(m1,m2,x,y);
if(res%gcd!=0)return -1;
x=qmul(x,res/gcd,m2);
r1+=x*m1;
m1=m2/gcd*m1;
r1=(r1%m1+m1)%m1;
}
return r1;
}