[模板]CRT(ex)

1 int CRT(){
2     int ans=0,x,y;
3     for(int i=1;i<=nom;++i){
4         ex_gcd(prr/tim[i],tim[i],x,y);
5         x=(x%tim[i]+tim[i])%tim[i];
6         ans=(ans+prr/tim[i]*aans[i]%prr*x%prr)%prr;
7     }
8     return ans;
9 }
CRT
 1 L gcd(L a,L b){return b?gcd(b,a%b):a;}
 2 void ex_gcd(L a,L b,L &x,L &y){
 3     if(!b){x=1;y=0;return;}
 4     ex_gcd(b,a%b,x,y);
 5     res=x;x=y;y=res-a/b*y;
 6 }
 7 L inv(L p,L mod){ex_gcd(p,mod,x,y);return (x%mod+mod)%mod;}
 8 int main(){
 9     while(scanf("%d",&n)==1){bj=0;
10         for(int i=1;i<=n;++i)scanf("%lld%lld",&m[i],&a[i]);
11         for(int i=2;i<=n;++i){
12             a1=a[i-1];a2=a[i];m1=m[i-1];m2=m[i];mgcd=gcd(m1,m2);
13             if((a1-a2)%mgcd){bj=1;break;}
14             m[i]=m1*m2/mgcd;
15             a[i]=(inv(m1/mgcd,m2/mgcd)*(a2-a1)/mgcd)%(m2/mgcd)*m1+a1;
16             a[i]=(a[i]%m[i]+m[i])%m[i];
17         }
18         printf("%lld\n",!bj?a[n]:-1);
19     }
20 }
ex_CRT

 

posted @ 2019-07-07 07:19  DeepinC  阅读(99)  评论(0编辑  收藏  举报