hiho – 1303
//解法和说明题面已经说的很清楚了. 下面就给出代码实现.
/** @Cain*/
const int maxn=1e4+5;
ll m[maxn],r[maxn];
int n;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(!b){
x = 1;
y = 0;
return a;
}
ll r = ex_gcd(b,a%b,x,y);
ll tmp = x;
x = y;
y = tmp - a/b*y;
return r;
}
ll tongyu()
{
ll M = m[1],R = r[1];
for(int i=2;i<=n;i++){
ll d = __gcd(m[i],M);
ll c = r[i] - R;
if(c%d) return -1; //无解
ll k1,k2;
ex_gcd(M/d,m[i]/d,k1,k2); //扩展GCD求解
k1 = ( k1* c/d ) % (m[i] / d);//别忘了扩充解系.!!!不懂的看看原理.
R = R + k1*M; // 计算x = m[1]*k[1] + r[1];(当然用k2也是可以的)
M = M / d * m[i]; //求解LCM(M,m[i]);
R %= M; //求解合并后的新R,同时让R最小.
//这些不理解的话写几个出来就懂了.
}
if( R < 0) R += M;
return R;
}
void solve()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> m[i] >> r[i];
cout << tongyu() << endl;
}