基础知识

拉格朗日定理:在模 pp 意义下,最高次项系数非 00nn 次多项式至多有 nn 个根。

线性同余方程组

可以使用 CRT 解决模数互质的情况,exCRT 解决模数不互质的情况。

{xa1(modm1)xa2(modm2)xa3(modm3)\begin{cases} x\equiv a_1 \pmod {m_1}\\ x\equiv a_2 \pmod {m_2}\\ \cdots\\ x\equiv a_3 \pmod {m_3}\\ \end{cases}

模数互质

M=i=1nmi,Mi=m÷miM=\prod_{i=1}^{n}m_i,M_i=m\div m_itit_i 是线性同余方程 Miti1(modmi)M_it_i\equiv 1 \pmod{m_i} 的一个解,也就是说 tit_iMiM_imim_i 的逆元(显然 MimiM_i \perp m_i 当且仅当 mim_i 两两互质),那么 x=i=1naiMiti+kMx=\sum_{i=1}^{n}a_iM_it_i + kM,最小非负整数解需要求 i=1naiMitimodM\sum_{i=1}^{n}a_iM_it_i\bmod M

1
2
3
4
5
6
7
8
9
10
i64 CRT(void) {
// x === a[i] (mod m[i])
i64 ans = 0, x;
for (int i = 1; i <= n; ++i) {
M[i] = mm / m[i];
t[i] = inv(M[i], m[i]);
ans = (ans + a[i] * M[i] * t[i]) % mm;
}
return (ans % mm + mm) % mm;
}

模数不互质

考虑如何合并两个方程组。我们先假定一定可以合并,然后看看什么时候合并之后的解是 \varnothing

假设我们有:

{xa(modA)xb(modB)\begin{cases} x\equiv a \pmod A\\ x\equiv b \pmod B \end{cases}

那么 x=Ak1+a=Bk2+bx=Ak_1+a=Bk_2+b,不难使用 exgcd 求出一组合法的 k1,k2k_1,k_2,则通解为:

K1=k1+t×Bgcd(A,B)K2=k2t×Agcd(A,B)K_1=k_1+t\times \frac{B}{\gcd(A,B)}\\ K_2=k_2-t\times \frac{A}{\gcd(A,B)}

x=A(k1+t×Bgcd(A,B))+a=Ak1+t×lcm(A,B)+ax=A(k_1+t\times \frac{B}{\gcd(A,B)})+a=Ak_1+t\times \operatorname{lcm}(A,B)+a,也就是:

xAk1+a(modlcm(A,B))x\equiv Ak_1+a \pmod{\operatorname{lcm}(A,B)}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
i64 exCRT(void) {
// x === A[i] (mod B[i])
i64 A = 1;
LL a = 0; // M 为当前合并的模数,ans 为当前答案
for (int i = 1; i <= n; ++i) {
i64 b = ::A[i], B = ::B[i], x, y, c = b - a;
i64 g = exgcd(A, B, x, y);
if (c % g != 0) return -1;
a = A * ((LL)x * (c / g)) + a;
A = A / g * B;
a %= A;
}
return (a + A) % A;
}

Nothing built can last forever.
本站由 iznomia 使用 Stellar 1.30.4 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。