Lucas 定理,一般用于求某组合数对某质数取模的值,即 \(\binom{n}{m} \bmod p\)。
一般来说,这种东西有一堆求法。\(n, m\) 小的话可以直接递推,\(p > n\) 可以根据定义 \(\binom{n}{m} = \frac{n!}{m!(n-m)!}\) 预处理阶乘和阶乘的逆元求。但是如果 \(p \le n\),阁下又当如何应对?此时你不能保证 \(n\) 和 \(n - m\) 模 \(p\) 的逆元存在。于是我们使用—— Lucas 定理。
Lucas 定理
\(\binom{n}{m} \equiv \prod\limits_{i = 0}^x \binom{n_i}{m_i} \pmod p\),其中 \(n_i, m_i\) 分别为 \(n, m\) 在 \(p\) 进制下的各位数字,即 \(n = \sum\limits_{i = 0}^xn_ip^i\),\(m = \sum\limits_{i = 0}^xm_ip^i\)。
这样我们就可以递归地在 \(\log_p\) 的时间复杂度内求出答案了。代码也很好写:
int CC(int n, int m) { return (n < m ? 0 : fac[n] * ifac[m] % P * ifac[n - m] % P); }
int C(int n, int m) { return (n == 0 ? 1 : C(n / P, m / P) * CC(n % P, m % P) % P); }
需要预处理 \(p\) 以内的阶乘及其逆元。这个肯定是存在的。
接下来我们尝试证明 Lucas 定理。
证明
引理 1
若 \(p\) 为质数且 \(1 \le k < p\),则 \(\binom{p}{k} \equiv 0 \pmod p\)。
根据定义,\(\binom{p}{k} = \frac{p!}{k!(p - k)!} = \frac{p(p - 1)(p - 2) \cdots (p - k + 1)}{k!}\)。我们知道 \(\binom{p}{k}\) 肯定是个整数,所以 \(k! | p(p - 1)(p - 2) \cdots (p - k + 1)\)。又因为 \(p\) 是个质数,而 \(k < p\),所以 \(1 \cdots k\) 中一定没有 \(p\) 的因子,所以 \(k!\) 一定与 \(p\) 互质。所以 \(k! | (p - 1)(p - 2) \cdots (p - k + 1)\),即 \(\frac{(p - 1)(p - 2) \cdots (p - k + 1)}{k!}\) 肯定是个整数。发现没?这里少了个 \(p\)。那说明 \(p\) 肯定就是 \(\binom{p}{k}\) 的一个因数,即 \(\binom{p}{k} \equiv 0 \pmod p\)。
引理 2
若 \(p\) 为质数,则 \((1 + x)^p \equiv 1 + x^p \pmod p\)。
有了上一个引理的铺垫,这个证起来就很简单了。根据二项式定理,我们有 \((1 + x)^p = \sum\limits_{i = 0}^p\binom{p}{i}x^i\)。根据引理 \(1\),我们有 \(\binom{p}{i} \equiv 0 \pmod p (1 \le i < p)\),也就是当 \(1 \le i < p\) 时,\(\binom{p}{i}x^i \equiv 0 \pmod p\)。所以 \((1 + x)^p \equiv \binom{p}{0}x^0 + \binom{p}{p}x^p = 1 + x^p \pmod p\)。
引理 3
若 \(p\) 为质数,则 \((1 + x)^{p^i} \equiv 1 + x^{p^i} \pmod p\)。
我们考虑将 \(p^i\) 里面的 \(p\) 一个个地“搬”到括号里。即 \((1 + x)^{p^i} = ((1 + x)^p)^{p^{i - 1}} \equiv (1 + x^p)^{p^{i - 1}} \pmod p\)。然后将 \(x^p\) 视为新的 \(x\),再进行如上的操作,得到 \((1 + x^{p^2})^{p^{i - 2}}\),以此类推,直到括号外 \(p\) 变为 \(0\) 次为止。这样就可以得到 \((1 + x)^{p^i} \equiv 1 + x^{p^i} \pmod p\)。
接下来我们开始证明 Lucas 定理。
考虑一个式子 \(\sum\limits_{K = 0}^N\binom{N}{K}X^K\)。我们接下来对它进行变形。
\[\begin {equation} \begin {split} \sum_{K = 0}^N\binom{N}{K}X^K &= (1 + X)^N,这是二项式定理;\\ &接下来我们将 N 按 P 进制展开,得到 \\ &= (1 + X)^{\sum_{i = 0}^{x}n_iP^i} \\ &我们知道 a^{(b + c)} = a^b·a^c,所以 \\ &= \prod_{i = 0}^x(1 + X)^{n_iP^i} \\ &= \prod_{i = 0}^x((1 + X)^{P^i})^{n_i} \\ &使用引理 3,我们得到 \\ &= \prod_{i = 0}^x(1 + X^{P^i})^{n_i} \\ &我们令 Y_i = X^{P^i},再使用二项式定理,得 \\ &= \prod_{i = 0}^x(\sum_{j = 0}^{n_i}\binom{n_i}{j}Y_i^j) \\ &我们知道当 n < m 时 \binom{n}{m} = 0。而且由于 n_i 是 N 的 P 进制表示的各数位,所以必有 n_i \le P - 1 \\ &因此我们可以直接将内层求和的上界变为 P - 1,因为多出来的那些项的值都为 0。所以 \\ &= \prod_{i = 0}^x(\sum_{j = 0}^{P - 1}\binom{n_i}{j}Y_i^j) \\ &接下来是整个过程中最关键的一步,也是最难理解的一步(? \\ &我们观察到此时的式子是一堆东西求和然后乘起来,类似于 (a_1 + a_2 + \cdots)(b_1 + b_2 + \cdots)\cdots \\ &考虑把它用乘法分配律展开,变成一堆东西乘起来然后求和的形式。\\ &如果令 f_{i, j} = \binom{n_i}{j}Y_i^j,那我们可以看出实际上 \\ &= (f_{0, 0} + f_{0, 1} + \cdots + f_{0, P - 1})(f_{1, 0} + f_{1, 1} + \cdots + f_{1, P - 1})\cdots(f_{x, 0} + f_{x, 1} + \cdots + f_{x, P - 1}) \\ &展开之后变成 \\ &= f_{0, 0}f_{1, 0}\cdots f_{x, 0} + f_{0, 0}f_{1, 0}\cdots f_{x - 1, 0}f_{x, 1} + \cdots + f_{0, P - 1}f_{1, P - 1}\cdots f_{x, P - 1} \\ &如果令 A 为 0 到 P - 1 之间(含两端)所有整数构成的集合,则 \\ &= \sum_{j_0, j_1, \cdots j_x \in A}\prod_{i = 0}^xf_{i, j_i} \\ &= \sum_{j_0, j_1, \cdots j_x \in A}\prod_{i = 0}^x\binom{n_i}{j_i}Y_i^{j_i} \\ &将 X_i 代回,得 \\ &= \sum_{j_0, j_1, \cdots j_x \in A}\prod_{i = 0}^x\binom{n_i}{j_i}(X^{P^i})^{j_i} \\ &根据 \prod ab = \prod a\prod b,我们有 \\ &= \sum_{j_0, j_1, \cdots j_x \in A}\prod_{i = 0}^x\binom{n_i}{j_i}\prod_{i = 0}^xX^{j_iP^i} \\ &根据 a^b·a^c=a^{b+c},我们有 \\ &= \sum_{j_0, j_1, \cdots j_x \in A}\prod_{i = 0}^x\binom{n_i}{j_i}X^{\sum_{j = 0}^xj_iP^i} \\ &接下来一步非常巧妙。我们观察到 X 的指数,发现这很像一个 P 进制数的形式,而所有 j_i 就是这个 P 进制数的数位。\\ &基于此,我们发现外层求和枚举所有 j_0 到 j_x,实际上是在枚举所有 x 位的 P 进制数。\\ &于是我们干脆就把所有 j 连到一起看作一个 P 进制数,并且令它的值为 K。再令 M 为所有 x 位 P 进制数中最大的。这样,我们得到 \\ &= \sum_{K = 0}^M\prod_{i = 0}^x\binom{n_i}{j_i}X^K \\ &进一步思考,我们会发现此处外层求和的上界可以直接改成 N。\\ &因为如果 K > N,考虑到 n_i 和 j_i 分别为 N 和 K 的 P 进制表示,则必然有至少一个 i 使得 n_i < j_i,\\ &从而 \binom{n_i}{j_i} 就会为 0,进而导致整个这个 K 的求和项都变成 0。所以这样的 K 不必再算。\\ &于是,我们得到了最后一个式子:\\ &= \sum_{K = 0}^N\prod_{i = 0}^x\binom{n_i}{j_i}X^K \pmod P。 \end {split} \end {equation} \]对比最后一个式子和第一个式子,即 \(\sum\limits_{K = 0}^N\binom{N}{K}X^K \equiv \sum\limits_{K = 0}^N\prod\limits_{i = 0}^x\binom{n_i}{j_i}X^K \pmod P\)。由于两边模 \(P\) 是等价的,所以相同次数的 \(X\) 应当拥有(在模 \(P\) 意义下)相同的系数。所以 \(\binom{N}{K} \equiv \prod\limits_{i = 0}^x\binom{n_i}{j_i} \pmod P\)。证毕。
标签:Lucas,pmod,sum,cdots,binom,prod,定理,equiv From: https://www.cnblogs.com/forgotmyhandle/p/18000113