中国剩余定理

2019-04-14 21:25发布

求解方程组 其中m互质  , 我们设 M=prod mi  ,Mi = M/mi 则通解为 x=sum ai*Mi*Mi^-^1+t*M   t为任意整数 因为Mi与mi互质  所以令Mi^-1 为Mi 模mi的逆元 我们发现对于任意ai * Mi * Mi^-1 它模mi 为 ai 因为 Mi * Mi^-1 =1
https://www.luogu.org/problemnew/show/P3868 #include #define N 15 #define LL long long using namespace std; int k; LL A[N],B[N],M=1,ans,x,y; LL mul(LL a,LL b,LL p){ LL ans=0; for(;b;b>>=1){ if(b&1) ans = (ans+a) % p; a = (a+a) % p; }return ans; } void exgcd(LL a,LL b){ if(!b){x=1,y=0; return;} exgcd(b,a%b); LL x1=y,y1=x-a/b*y; x=x1,y=y1; } int main(){ scanf("%d",&k); for(int i=1;i<=k;i++) scanf("%lld",&A[i]); for(int i=1;i<=k;i++) scanf("%lld",&B[i]), M *= B[i]; for(int i=1;i<=k;i++) A[i] = (A[i] % B[i] + B[i]) % B[i]; for(int i=1;i<=k;i++){ int Mi=M/B[i]; exgcd(Mi,B[i]); x=(x+B[i])%B[i]; ans = (ans+mul(mul(x,Mi,M),A[i],M))%M; }printf("%lld",(ans+M)%M); return 0; }