CRT
CRT 是用来解决一元线性同余方程组的。
例如,对于下面的方程组:
⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)⋯⋯x≡an(modmn)
其中,m1,m2,...,mn 是两两互质的整数。
我们令 m=i=1∏nmi,Mi=mim,ti 是方程 Miti≡1(modm1) 的一个解。
那么 x 有整数解,解为 x=i=1∑naiMiti。
证明如下:
因为 Mi=mim 是除了 mi 之外所有模数的倍数,所以对于 ∀k̸=i,有 Mi≡0(modmk),也即 aiMiti≡0(modmk)。
又因为 aiMiti≡ai(modmi),所以如果代入 x=i=1∑naiMiti,原方程组成立。
可以理解成每个 aiMiti 只对 i 这个方程有贡献,对其他方程都没有影响。
证毕。
这时,解出来的 x 是一个特解,通解可以用 x+km(k∈Z) 表示。
如果题目要我们求最小整数解,只需把 x 对 m 取模,使得 x∈[0,m−1] 即可。
模板题:[51nod 1079] 中国剩余定理
exCRT
CRT 有一个缺陷,就是它只能解决 m 两两互质问题,若不满足 m 两两互质,我们就要用到 exCRT 算法了。
我们考虑能否把 {x≡a1(modm1)x≡a2(modm2) 合并成一个方程。
把这个方程组变形,得到 {x=a1+m1y1x=a2+m2y2,也即 m1y1−m2y2=a2−a1。
那我们就可以用扩展欧几里得算法来解这个式子。
如果这个式子无解,则原同余方程组无解。
否则的话,解出一组可行解 (y1,y2),代回去解出一个关于 x 的可行解 x1,令 m=lcm(m1,m2)。上述的方程组就等价于:
x≡x1(modm)
两两合并,最后只剩下 1 个方程,解出来便是答案。
模板题:[POJ 2891] Strange Way to Express Integers