ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0){
x=1;
y=0;
return a;
}
else{
ll r=exgcd(b,a%b,x,y);
ll t;
t=x;
x=y;
y=t-a/b*y;
return r; //r是公倍数
}
}
中国同余方程
从1开始,不互质
ll solve(){
ll M=a[1],R=r[1],x,y,d;
for(int i=2;i<=n;i++){
d=exgcd(M,a[i],x,y);
if((R-r[i])%d!=0) return -1;
x=(R-r[i])/d*x%a[i];
R-=x*M;
M=M/d*a[i];
R%=M;
}
return (R%M+M)%M;
}
互质
ll china() {
ll M,res;
M=1;res=0;
for(int i=1;i<=n;i++) M*=a[i];
for(int i=1;i<=n;i++) {
ll m,p,d,y;
m=M/a[i];d=exgcd(m,a[i],p,y);
res=(res+m*p*b[i])%M;
}
if(res<0) res+=M;
return res;
}
幂取模
例如a29=(a14)2*a,a14=(a7)2,a7=(a3)2*a,a3=a2*a;
这样实现时间复杂度就是O(logn),与二分查找很类似,每次规模缩减一半。
int pow_mod(int a,int n,int m)
{
if(n==0)return 1;
int x=pow_mod(a,n/2,m);
ll ans=(ll)x*x%m;
if(n%2==1)ans=ans*a%m;
return (int)ans;
}