中国剩余定理模板&俄罗斯乘法

 

void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){
    if(!b){d=a;x=1LL;y=0LL;}
    else {ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
/////大数乘法取模转换成加法取模,避免爆long long ll mult(ll a,ll k,ll m){ ll res
=0; while(k){ if(k&1LL)res=(res+a)%m; k>>=1; a=(a<<1)%m; } return res; }
///// 这段在正常的中国剩余定理中可以去掉 ll china(
int n,ll *a,ll *m){ ll M=1,d,y,x=0; for(int i=0;i<n;i++)M*=m[i]; for(int i=0;i<n;i++){ ll w=M/m[i]; ex_gcd(m[i],w,d,d,y); x=(x+mult(y,mult(w,a[i],M),M))%M; } return (x+M)%M; }

 

posted on 2016-07-30 19:59  Beserious  阅读(570)  评论(0编辑  收藏  举报