首先题意为求同余线性方程x%pi=ri
首先考虑两个方程x%a1=m1,x%a2=m2;
化简x=k1a1+m1,x=k2a2+m2;
k1a1-k2a2=m2-m1;
由裴蜀定理可知该方程有整数解的条件是 (m2-m1)%(gcd(a1,a2))==0
同时可以由扩展欧几里得得到k1和k2
同时这个方程的通解是k1=k1+ka2/gcd(a1,a2), k2=k2+ka1/gcd(a1,a2);
因此 x=k1a1+m1=k1a1+m1+k*lcm(a1,a2);
设k1*a1+m1为m, lcm(a1,a2)为a所以得到新的方程x=ka+m;
与之前 两个方程形式一样所以可以把两个方程化为一个方程,重复这个过程可以把题目的n个方程组化为1个且可知这个方程的m就是原n个方程的解
#include<bits/stdc++.h>
#define int long long
using namespace std;
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;cin>>n;
int flag=1;
int a1,m1,a2,m2;
cin>>a1>>m1;
for(int i=2;i<=n;i++){
cin>>a2>>m2;
int x,y;
int d=exgcd(a1,a2,x,y);
if((m2-m1)%d!=0){
flag=0;
break;
}
x*=(m2-m1)/d;
int t=abs(a2/d);
x=(x%(t)+t)%(t);
m1=x*a1+m1;
a1=abs(a1/d*a2);
}
if(flag){
cout<<m1;
}else cout<<-1;
return 0;
}