[模板] exCRT
先考虑两个方程的情况,即 x≡x1(modm1),x≡x2(modm2)。
第一个式子等价于 ∃k∈Z,x=km1+x1。
代入第二个式子,有 km1≡x2−x1(modm2)。
这等价于 ∃q∈Z,km1+qm2=x2−x1。
左边可以看作 m1 与 m2 的线性组合,题目保证这个方程有解,那么一定有 (m1,m2)∣x2−x1。
所以这又等价于 k(m1,m2)m1≡(m1,m2)x2−x1(mod(m1,m2)m2)。
由于 ((m1,m2)m1,(m1,m2)m2)=1,那么这个方程在模 (m1,m2)m2 的意义下是有唯一解的,记作 k0。
所以 ∃t∈Z,k=k0+t(m1,m2)m2,带回 x=km1+x1,得到 x=k0m1+x1+(m1,m2)tm1m2。
上面只说明了所有解应当满足 x≡k0m1+x1(mod(m1,m2)m1m2),并且找到了一个解。
但是反过来,如果 x≡k0m1+x1(mod(m1,m2)m1m2),它一定是原方程的解吗?
设 x=k0m1+x1+s(m1,m2)m1m2,s∈Z,那么 x≡k0m1+x1≡x1(modm1),第一式成立;
接下来 x≡k0m1+x1(modm2),我们知道 k0(m1,m2)m1≡(m1,m2)x2−x1(mod(m1,m2)m2),那么 k0m1≡x2−x1(modm2),于是 x≡x2−x1+x1≡x2(modm2)。
所以我们证明了 x 的所有解形如 k0m1+x1+s(m1,m2)m1m2,s∈Z。
那么这两个方程的全部解就是 x≡k0m1+x1(mod(m1,m2)m1m2) 的全部解,我们把两个方程合并为了一个方程。
AC Code。
[CF1770C] Koxia and Number Theory
首先 a1∼an 必须两两不同,然后可以给 a 排个序。
然后对于 i<j,我们有 (ai+x,aj+x)=(ai+x,aj−ai)=1。
这意味着什么?对于质数 p,我们有若 p∣(aj−ai),应当有 p∣(ai+x)。
于是在 x≡−ai(modp),于是在 mod p 意义下排掉了一个解。
根据中国剩余定理,对于方程组:
⎩⎨⎧x≡x1(modp1)x≡x2(modp2)⋮x≡xk(modpk)
其中 p1∼pk 是互不相同的质数,是一定可以构造出来解的,因为合并的过程中两个模数 m1,m2 始终满足 (m1,m2)=1。
对于每一种 p,我们至多能排除掉 n 个数,所以对于 p>n 是一定不会被全部排除掉的,所以我们只需要关心 p≤n 的情况。
所以我们预处理出 ≤n 的质数,然后枚举这些质数,看是否有 p∣(aj−ai),如果有的话我们需要在 mod p 的意义下排除掉 −ai。
可以用 set 维护,那么复杂度就是 O(∑n2π(n)logn)。
AC Code。