原来编程真的可以解决数学题
//表达整数的奇怪方式,拿多少还剩多少,将多个条件连在一起。求原整数,hhh
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
//扩展欧几里得算法
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b)
{
x=1,y=0;
return a;
}
LL d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
int n;
cin>>n;
bool flag =true;//有解
LL a1,m1;
cin>>a1>>m1;
for(int i=0;i<n;i++)
{
LL a2,m2;
cin>>a2>>m2;
LL k1,k2;
LL d=exgcd(a1,a2,k1,k2);
if((m2-m1)%d)
{
flag=false;//无解
break;
}
//根据原理两个方程,更新k,a,m
k1*=(m2-m1);//返回欧几里得算法正确的结果
LL t=a2/d;//有多组解,用于求k1
k1=(k1%t+t)%t;//求最小值
m1=a1*k1+m1;//由原理得
a1=abs(a1/d*a2);//由原理求最小公倍数
}
if(flag)
{
cout<<(m1%a1+a1)%a1<<endl;
}
else puts("-1");
return 0;
}