中国剩余定理模板题,记得快速乘(慢速乘)。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=15; ll a[maxn],b[maxn],m=1; ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0){ x=1;y=0; return a; } ll ret=exgcd(b,a%b,x,y); ll temp=x; x=y;y=temp-(a/b)*y; return ret; } ll qmul(ll a,ll b,ll mod) { ll ans=0; while(b>0) { if(b&1) ans=(ans+a)%mod; a=(a+a)%mod; b>>=1; } return ans; } int main(){ int n; ll ans=0; scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%lld",&a[i]); for(int i=1;i<=n;++i){ scanf("%lld",&b[i]); m*=b[i]; } for(int i=1;i<=n;++i){ a[i]=(a[i]%b[i]+b[i])%b[i]; ll mi=m/b[i],x,y; exgcd(mi,b[i],x,y); x=(x%b[i]+b[i])%b[i]; ans=(ans+qmul(qmul(mi,a[i],m),x,m))%m; } ans=(ans+m)%m; printf("%lld",ans); return 0; }