P4777 【模板】扩展中国剩余定理(EXCRT)
浪费我好多时间因为没找着一篇好的教程嘤嘤嘤
推荐一位大神的博客(是真的厉害):dalao
以下是c++版本的程序
#include <iostream> #include <cstdio> #define ll __int128 using namespace std; ll C1,C2,M1,M2,C[1000002],M[1000002],x,y,n,t; ll gcd(ll x,ll y){ return y==0?x:gcd(y,x%y); } ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0){ x=1,y=0; return a; } int r=exgcd(b,a%b,x,y); int tmp; tmp=x,x=y,y=tmp-(a/b)*y; return r; } ll inv(ll a,ll b){ ll r=exgcd(a,b,x,y); return (x%b+b)%b; } int main(){ scanf("%lld",&n); for(ll i=1;i<=n;i++) scanf("%lld%lld",&M[i],&C[i]); for(ll i=2;i<=n;i++){ C1=C[i-1],C2=C[i],M1=M[i-1],M2=M[i]; t=gcd(M1,M2); M[i]=(M1*M2)/t; C[i]=(inv(M1/t,M2/t)*(C2-C1)/t)%(M2/t)*M1+C1; C[i]=(C[i]%M[i]+M[i])%M[i]; } printf("%lld",C[n]); return 0; }