【分析与思路】中的
与题意正好相反,请读者注意!!!
假设我们已知前 个方程的解为 ,记
则 是前 个方程的通解。
于是,我们只需要找出一个 ,使得
则 即加入第 个方程的解。
于是,我们只需循环 次求解即可。
如何求 ?很简单,把方程移项,得:
用扩展gcd
求解即可。
注意乘法时可能爆long long
,需要用快速乘优化。
const int N=1e5+100;
ll exgcd(ll a,ll b,ll &x,ll &y){
if (b==0){
x=1;y=0;
return a;
}
else{
ll d=exgcd(b,a%b,y,x);
y-=x*(a/b);return d;
}
}
ll slow_mul(ll a,ll b,ll mod){
register ll ret=0ll;
while (b){
if (b&1) ret=(ret+a)%mod;
a=(a+a)%mod;b>>=1;
}
return ret;
}
ll a[N],b[N],M,ans,n;
int main(){
// freopen("t1.in","r",stdin);
n=read();M=1ll;ans=0;
for(int i=1;i<=n;i++){
b[i]=read();
a[i]=read();
}
for(int i=1;i<=n;i++){
ll B=((a[i]-ans)%b[i]+b[i])%b[i];
ll t,y,GCD=exgcd(M,b[i],t,y);
t=slow_mul(t,B/GCD,b[i]);
ans+=M*t;
M*=b[i]/GCD;
ans=(ans+M)%M;
}
printf("%lld",ans);
return 0;
}