题意:找到一个m,使得m%ai=ri,并且这个m最小
m = a1*x + r1;
m = a2*y + r2;
可得:a1*x - a2*y = r2 - r1
可得:a1*x ≡ r2-r1(moda2);
r = gcd(a1,a2);
求一次同余线性方程---判定条件 (r2-r1)% r==0
解得 x ≡ ((r2-r1)/r)*x%(a2/r)+a2/r)%(a2/r);
r1 = a1 * x + r1;
a1 = a1 * a2 / r;再与下一个等式求解
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef __int64 LL;
LL x,y;
LL ecgcd(LL a,LL b)
{
if(b == 0) {x = 1,y = 0;return a;}
int k = ecgcd(b,a%b);
LL t = x;
x = y;
y = t - a/b*y;
return k;
}
int main()
{
LL n,a1,a2,r1,r2;
while(~scanf("%I64d",&n))
{
scanf("%I64d%I64d",&a1,&r1);
bool flag = false;
for(LL i = 2;i <= n;i++)
{
scanf("%I64d%I64d",&a2,&r2);
if(flag) continue;
LL r = ecgcd(a1,a2);
LL R = r2 - r1;
if(R%r) {flag = true;continue;}//求解一次同余式的判定
LL mod = a2/r;
x = (R/r*x%mod+mod) % mod;//解得a1*x = R (mod a2);的一个特解 即最小值
r1 = x*a1 + r1;
a1 = a1*a2/r;
}
if(flag) printf("-1\n");
else printf("%I64d\n",r1);
}
}
若还是不明白:点这里 http://hi.baidu.com/buaa_babt/item/5f4c013772c7cbe3e6bb7a2d