题目链接:https://www.luogu.org/problem/P3868
题意:就是裸的中国剩余定理,为了防止TLE要加上快速乘,但是要注意a[i]可能为负数,故需要对a[i]做处理:a[i]=(a[i]%b[i]+b[i])%b[i])
#include<iostream> #include<cstdio> #include<vector> #include<queue> #include<algorithm> #include<cstring> using namespace std; typedef long long lt; lt read() { lt f=1,x=0; char ss=getchar(); while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();} while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();} return x*f; } int k; lt a[20],b[20]; lt qmul(lt a,lt b,lt mod) { lt ans=0; while(b>0) { if(b&1) ans=(ans+a)%mod; a=(a+a)%mod; b>>=1; } return ans; } void exgcd(lt a,lt b,lt &x,lt &y) { if(b==0){ x=1; y=0; return;} exgcd(b,a%b,x,y); int tp=x; x=y; y=tp-a/b*y; } lt china() { lt ans=0,lcm=1,x,y; for(int i=1;i<=k;++i) lcm*=b[i]; for(int i=1;i<=k;++i) { lt tp=lcm/b[i]; exgcd(tp,b[i],x,y); x=(x%b[i]+b[i])%b[i]; ans=(ans+qmul(qmul(tp,x,lcm),a[i],lcm))%lcm;//记得快速乘 } return (ans+lcm)%lcm; } int main() { k=read(); for(int i=1;i<=k;++i) a[i]=read(); for(int i=1;i<=k;++i) b[i]=read(); for(int i=1;i<=k;i++) a[i]=(a[i]%b[i]+b[i])%b[i]; cout<<china(); return 0; //niiick }