给定 2n 个整数a1,a2,…,an和m1,m2,…,mn,求一个最小的非负整数 x,满足∀i∈[1,n],x≡mi(mod ai)。
输入格式
第1 行包含整数 n。
第 2..n+1行:每 i+1行包含两个整数ai和mi,数之间用空格隔开。
输出格式
输出最小非负整数 x,如果 x 不存在,则输出 −1。
如果存在 x,则数据保证 x一定在64位整数范围内。
数据范围
1≤ai≤231−1,
0≤mi<ai
1≤n≤25
输入样例:
2
8 7
11 9
输出样例:
31
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int n;
int extend_gcd(int a,int b,int &x,int &y)
{
if(b==0){
x=1,y=0;
return a;
}
int res=extend_gcd(b,a%b,y,x);
y-=x*(a/b);
return res;
}
int change(int a,int b)
{
return ((a%b)+b)%b;
}
signed main()
{
cin>>n;
int a1,m1;
cin>>a1>>m1;
for(int i=1;i<n;i++){
int a2,m2,k1,k2;
cin>>a2>>m2;
int d=extend_gcd(a1,-a2,k1,k2);
if((m2-m1)%d){ puts("-1");return 0;}
k1=change(k1*(m2-m1)/d,abs(a2/d));
m1+=k1*a1;
a1=abs(a1/d*a2);
}
cout<<m1<<endl;
return 0;
}