[模板] exCRT

先考虑两个方程的情况,即 x≡x1(modm1),x≡x2(modm2)x\equiv x_1\pmod{m_1},x\equiv x_2\pmod{m_2}。

第一个式子等价于 ∃k∈Z,x=km1+x1\exists k \in \mathbb Z,x=km_1+x_1。

代入第二个式子,有 km1≡x2−x1(modm2)km_1\equiv x_2-x_1\pmod{m_2}。

这等价于 ∃q∈Z,km1+qm2=x2−x1\exists q\in \mathbb Z,km_1+qm_2=x_2-x_1。

左边可以看作 m1m_1 与 m2m_2 的线性组合,题目保证这个方程有解,那么一定有 (m1,m2)∣x2−x1(m_1,m_2)\mid x_2-x_1。

所以这又等价于 km1(m1,m2)≡x2−x1(m1,m2)(modm2(m1,m2))k\cfrac{m_1}{(m_1,m_2)}\equiv\cfrac{x_2-x_1}{(m_1,m_2)}\pmod{\cfrac{m_2}{(m_1,m_2)}}。

由于 (m1(m1,m2),m2(m1,m2))=1\left(\cfrac{m_1}{(m_1,m_2)},\cfrac{m_2}{(m_1,m_2)}\right)=1,那么这个方程在模 m2(m1,m2)\cfrac{m_2}{(m_1,m_2)} 的意义下是有唯一解的,记作 k0k_0。

所以 ∃t∈Z,k=k0+tm2(m1,m2)\exist t\in \mathbb Z,k=k_0+t\cfrac{m_2}{(m_1,m_2)},带回 x=km1+x1x=km_1+x_1,得到 x=k0m1+x1+tm1m2(m1,m2)x=k_0m_1+x_1+\cfrac{tm_1m_2}{(m_1,m_2)}。

上面只说明了所有解应当满足 x≡k0m1+x1(modm1m2(m1,m2))x\equiv k_0m_1+x_1\pmod{\cfrac{m_1m_2}{(m_1,m_2)}},并且找到了一个解。

但是反过来,如果 x≡k0m1+x1(modm1m2(m1,m2))x\equiv k_0m_1+x_1\pmod{\cfrac{m_1m_2}{(m_1,m_2)}},它一定是原方程的解吗?

设 x=k0m1+x1+sm1m2(m1,m2),s∈Zx=k_0m_1+x_1+s\cfrac{m_1m_2}{(m_1,m_2)}, s\in \mathbb Z,那么 x≡k0m1+x1≡x1(modm1)x\equiv k_0m_1+x_1\equiv x_1\pmod{m_1},第一式成立;

接下来 x≡k0m1+x1(modm2)x\equiv k_0m_1+x_1\pmod{m_2},我们知道 k0m1(m1,m2)≡x2−x1(m1,m2)(modm2(m1,m2))k_0\cfrac{m_1}{(m_1,m_2)}\equiv \cfrac{x_2-x_1}{(m_1,m_2)}\pmod{\cfrac{m_2}{(m_1,m_2)}},那么 k0m1≡x2−x1(modm2)k_0m_1\equiv x_2-x_1\pmod{m_2},于是 x≡x2−x1+x1≡x2(modm2)x\equiv x_2-x_1+x_1\equiv x_2\pmod{m_2}。

所以我们证明了 xx 的所有解形如 k0m1+x1+sm1m2(m1,m2),s∈Zk_0m_1+x_1+s\cfrac{m_1m_2}{(m_1,m_2)},s\in\mathbb Z。

那么这两个方程的全部解就是 x≡k0m1+x1(modm1m2(m1,m2))x\equiv k_0m_1+x_1\pmod{\cfrac{m_1m_2}{(m_1,m_2)}} 的全部解,我们把两个方程合并为了一个方程。

AC Code。

[CF1770C] Koxia and Number Theory

首先 a1∼ana_1\sim a_n 必须两两不同,然后可以给 aa 排个序。

然后对于 i<ji<j,我们有 (ai+x,aj+x)=(ai+x,aj−ai)=1(a_i+x,a_j+x)=(a_i+x,a_j-a_i)=1。

这意味着什么?对于质数 pp,我们有若 p∣(aj−ai)p\mid (a_j-a_i),应当有 p∤(ai+x)p\not\mid (a_i+x)。

于是在 x≢−ai(modp)x\not\equiv -a_i\pmod p,于是在 mod p\text{mod }p 意义下排掉了一个解。

根据中国剩余定理,对于方程组:

{x≡x1(modp1)x≡x2(modp2)⋮x≡xk(modpk)\begin{cases} x\equiv x_1\pmod{p_1}\\ x\equiv x_2\pmod{p_2}\\ \vdots\\ x\equiv x_k\pmod{p_k} \end{cases}

其中 p1∼pkp_1\sim p_k 是互不相同的质数,是一定可以构造出来解的,因为合并的过程中两个模数 m1,m2m_1,m_2 始终满足 (m1,m2)=1(m_1,m_2)=1。

对于每一种 pp,我们至多能排除掉 nn 个数,所以对于 p>np>n 是一定不会被全部排除掉的,所以我们只需要关心 p≤np\le n 的情况。

所以我们预处理出 ≤n\le n 的质数,然后枚举这些质数,看是否有 p∣(aj−ai)p\mid(a_j-a_i),如果有的话我们需要在 mod p\text{mod }p 的意义下排除掉 −ai-a_i。

可以用 set 维护,那么复杂度就是 O(∑n2π(n)log⁡n)O(\sum n^2\pi(n)\log n)。

AC Code。