题目地址:http://poj.org/problem?id=2891
思路:http://blog.csdn.net/qq_34446253/article/details/52192786
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
typedef long long LL;
LL gcdEx(LL a,LL b,LL& x,LL& y)
{ //求ax+by=gcd(a,b) 的整数解 返回gcd(a,b);
if(b==0) {
x=1; y=0; return a;
}
LL x1,y1;
LL gcd=gcdEx(b,a%b,x1,y1);
x=y1;
y=x1-a/b*y1;
return gcd;
}
int main()
{
int k;
LL a,x,y,n,a1,n1,ok,lcm,u0,d;;
while(scanf("%lld",&k)!=EOF)
{
ok=1;
cin>>n>>a;
for(int i=1;i<k;i++)
{
cin>>n1>>a1;
if(!ok) continue;
d=gcdEx(n,n1,x,y);
if((a1-a)%d) {
ok=0;continue;
}
lcm=n/d*n1;
u0=(a-a1)/d*x%n1; //n1*x + n2*y = (a-a1) 的一个解u0 ,别忘记%n1
a=(a-u0*n)%lcm; //合并a
n=lcm; //合并n
}
if(ok) cout<<(a%n+n)%n<<endl; //最后只有一个式子x≡a(mod n)求出最小解
else printf("-1\n");
}
return 0;
}