http://162.105.81.212/JudgeOnline/problem?id=2891
思路:求最小的x,满足 x=ai (mod mi), 这里的ai不互质。考虑两个方程时, x = a1 (mod m1), x = a2 (mod m2), x = a1 + m1*y, x = a2 + m2*z, 联立两式化简得, m1*y+m2*z=a2-a1, 求解出y, 则x=a1+m1*y.对于多个方程,可以另a1=x, m1 = m1*m2, 依次求解下去即可。看了解题报告才能乱七八糟的写了代码:
题意是说,给一组a[i],r[i],求一个最小的m,满足 for_each(i=0: n) a[i]%m=r[i].
即 a[i]*x+r[i]=m,不存在输出-1。
我们首先得到 a1 * x + r1 = m 和 a2 * y + r2 = m,联立得到
a1 * x - a2 * y = r2 - r1,利用ex_gcd解之,先解得a1*X-a2*Y=GCD(a1,a2)时的X Y值和a1,a2的gcd,x y存在整数解的条件是 gcd | r2-r1.是否输出-1就是从这判断。有解即为
x=(r2-r1)/gcd*X
tmp=a2/gcd, x=( ( r2 - r1 ) / gcd * X % tmp + tmp ) % tmp;
接着输入下一组a3,r3,问题变为求满足LCM(a1,a2)%m1=m和
a3%m1=r3的新的m值:m1
LCM(a1,a2) * x + a3 * y = r3 - m 这样只要a1 a2 r1 r2 轮流迭代即可,不用开数组。题目也没说k多大,暗示本题不用开数组。每次更新a1为LCM(a1,a2),r1为m即可。不过注意求x时 ,保持通用性。