个人感觉比中国剩余定理那道题还要普遍性强,这么好的模板题,赶快保存下来
代码
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
ll r[1005],m[1005];
int N;
int gcd(ll a,ll b) //讲道理扩展欧几里德是可以求gcd的,但是呢这题分开写也没关系
{
if(a%b==0)
return b;
return gcd(b,a%b);
}
void e_gcd(ll A,ll B,ll &x,ll &y) //要求gcd咱可以稍稍改一下 void e_gcd(ll A,ll B,ll &x,ll &y,ll gcd)
{
if(!B)
{
x=1,y=0; //然后在个if语句中再加一句 gcd=A;就OK了
return;
}
e_gcd(B,A%B,x,y);
ll temp=y;
y=x-(A/B)*y;
x=temp;
}
ll china()
{
ll M=m[1],R=r[1];
for(int i=2;i<=N;i++)
{
ll d=gcd(M,m[i]);
ll c=r[i]-R;
if(c%d)
return -1;
ll x=0,y=0;
e_gcd(M/d,m[i]/d,x,y);
x=(c/d*x)%(m[i]/d);
R+=x*M;
M=M/d*m[i];
R%=M;
}
while(R<0)
R+=M;
return R;
}
int main()
{
while(~scanf("%d",&N))
{
for(int i=1;i<=N;i++)
scanf("%lld%lld",&m[i],&r[i]);
printf("%lld\n",china());
}
return 0;
}