P4777 【模板】扩展中国剩余定理(EXCRT)
链接: link.
扩展板子
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
ll a[100010],b[100010];
ll M,ans,x,y;
ll exgcd(ll p,ll q,ll &x,ll &y)
{
if(!q)
{
x=1;
y=0;
return p;
}
ll g=exgcd(q,p%q,y,x);
y-=(p/q)*x;
return g;
}
ll mul(ll a,ll b,ll c)
{
ll res=0;
while(b>0)
{
if(b&1)
{
res=((res+a))%c;
}
a=(a+a)%c;
b>>=1;
}
return (res%c+c)%c;
}
ll excrt()
{
M=b[1];
ans=a[1];
for(ll i=2;i<=n;++i)
{
ll c=((a[i]-ans)%b[i]+b[i])%b[i];
ll g=exgcd(M,b[i],x,y);
ll p=b[i]/g;
x=mul(x,c/g,p);
ans+=x*M;
M*=p;
ans=(ans%M+M)%M;
}
return ans;
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>b[i]>>a[i];
}
cout<<excrt();
return 0;
}