扩展卢卡斯定理(exlucas)

参考 FadingP4720 【模板】扩展卢卡斯定理 / exLucas题解

求解问题:

对于给定的 \(n,m,P\),求:

\[C_n^m \bmod P \]

其中不保证 \(P\) 为质数。

卢卡斯定理的局限性:

对于 卢卡斯定理,只能求解 \(P\) 为质素且 \(P\) 较小的问题,当 \(P\) 为合数时,不仅卢卡斯定理会爆掉,与其配套的费马小定理求逆元也会爆掉,所以不能使用卢卡斯定理。

扩展卢卡斯定理:

其实扩展卢卡斯定理与卢卡斯定理并没有什么关系,但需要预先了解中国剩余定理扩展欧几里得
我们知道,任何一个合数都可以表示为若干个质数幂的积:

\[N=p_1^{c_1}\cdot p_2^{c_2}\cdot p_3^{c_3}\cdot \cdots \cdot p_m^{c_m} \]

那么我们是否可以将问题转化一下呢?
我们试着将 \(P\) 分解:

\[P=p_1^{c_1}\cdot p_2^{c_2}\cdot p_3^{c_3}\cdot\dots \]

记要求的 \(C_n^m\) 的值为 \(b\)\(C_n^m\bmod p_i^{c_i}\) 的值为 \(a_i\),我们可以列出同余方程:

\[\left\{\begin{gather*} b \equiv a_1 \pmod{p_1^{c_1}}\\ b \equiv a_2 \pmod{p_2^{c_2}}\\ b \equiv a_2 \pmod{p_2^{c_3}}\\ \vdots\\ \end{gather*}\right. \]

显然这是中国剩余定理干的事情。
那么我们的问题就变成了求(为了方便我去掉了 \(p\) 的下标):

\[C_n^m\bmod p^c \]

就是求:

\[\frac{n!}{m!(n-m)!}\bmod p^c \]

发现我们说了半天发现 \(\gcd(m!,p^c)\)\(\gcd((n-m)!,p^c)\) 不一定等于一,也就是不一定互质,也就求不了逆元。于是我们运用小学一年级的知识将式子变形为:

\[\frac{\frac{n!}{p^x}}{\frac{m!}{p^y}\cdot\frac{(n-m)!}{p^z}}p^{x-y-z}\bmod p^c \]

其中 \(\frac{n!}{p^x}\)\(x\) 的值为 \(n!\) 的因子中包含多少个 \(p\)
同理 \(\frac{m!}{p^y}\) 中的 \(y\)\(\frac{(n-m)!}{p^z}\) 中的 \(z\) 分别对应 \(m!\)\((n-m)!\) 的因子中 \(p\) 的个数。
你就会神奇的发现 \(n!\)\(m!\)\((n-m)!\) 中的 \(p\) 因子被干掉了,就可以开开心心的使用扩展欧几里得求逆元了。
但我们在开开心心之前要在考虑怎么求 \(\frac{n!}{p^x}\)?
我们将 \(n!\) 展开:

\[n!=1\cdot 2\cdot 3 \cdots p\cdots 2p \cdots n \]

将有关 \(p\) 的项提出来:

\[n!=(1p\cdot 2p\cdot 3p\cdots)(1\cdot 2\cdot 3\cdots) \]

根据阶乘的性质可知 \(n!\) 中有 \(\lfloor\frac{n}{p}\rfloor\) 个。
所以我们就可以写成:

\[n!=p^{\lfloor\frac{n}{p}\rfloor}(\lfloor\frac{n}{p}\rfloor)!(1\cdot 2\cdot 3\cdots) \]

再看后面这一坨:

\[1\cdot 2\cdot 3\cdots (p-1)\cdot(p+1)\cdots2(p-1)\cdot2(p+1)\cdots \]

你发现了什么?什么也没有?那我们将每个数 \(\bmod p\) 试试:

\[1\cdot 2\cdot 3\cdots (p-1)\cdot1\cdot2\cdot3\cdots(p-1)\cdot1\cdot2\cdot3\cdots \]

这下是个人除非你不是都能看出来他在 \(\bmod p\) 的时候有循环节,那么我们就可以将其写成幂的形式:

\[n!=p^{\lfloor\frac{n}{p}\rfloor}(\lfloor\frac{n}{p}\rfloor)!(\prod_{i=1,i\not\equiv0\pmod{p}}^{p^c})^{\lfloor\frac{n}{p^c}\rfloor}[p^c\cdot(p^c+1)\cdots n] \]

其实后边这俩可以直接暴力求,前面这个 \(p^{\lfloor\frac{n}{p}\rfloor}\) 可以直接除去,我们的目的是将 \(n!\)\(p\) 的因子除去,但现在这个 \((\lfloor\frac{n}{p}\rfloor)!\) 中可能还有 \(p\) ,这个好办,继续递归求解即可。我们设 \(f_n\)\(\frac{n!}{p^x}\),则:

\[f_n=f_{\lfloor\frac{n}{p}\rfloor}(\prod_{i=1,i\not\equiv0\pmod{p}}^{p^c})^{\lfloor\frac{n}{p^c}\rfloor}[p^c\cdot(p^c+1)\cdots n] \]

其中 \(f_0=1\)
于是原来那个式子就变成了:

\[\frac{f_n}{f_m\cdot f_{n-m}}p^{x-y-z}\bmod p^c \]

别急,还有问题,就是这个 \(p^{x-y-z}\) 该如何求?
我们设 \(g_x\)\(\frac{n!}{p^x}\) 中的 \(x\),观察上面这个

\[n!=p^{\lfloor\frac{n}{p}\rfloor}(\lfloor\frac{n}{p}\rfloor)!(\prod_{i=1,i\not\equiv0\pmod{p}}^{p^c})^{\lfloor\frac{n}{p^c}\rfloor}[p^c\cdot(p^c+1)\cdots n] \]

就可以知道我们要求的是 \(\lfloor \frac{n}{p} \rfloor\) 但你要只求 \(\lfloor \frac{n}{p} \rfloor\) 就错了,因为你求 \(f_n\) 的时候用到了递归解决 \((\lfloor\frac{n}{p}\rfloor)!\) 中有 \(p\) 的问题,求 \(g_n\) 的时候就也需要用递归去求总幂:

\[g_n=\lfloor \frac{n}{p} \rfloor+g_{\lfloor \frac{n}{p} \rfloor} \]

这样你就得到了这样一个诡异式子:

\[\frac{f_n}{f_m\cdot f_{n-m}}p^{g_n-g_m-g_{n-m}}\bmod p^c \]

聪明的你已经将分母部分所有 \(p\) 的因数干掉了,这下可以开开心心的使用扩展欧几里得求逆元了。
最后的最后,使用中国剩余定理合并一元线性同余方程组即可。

posted @ 2026-07-07 16:10  LZYXT  阅读(12)  评论(0)    收藏  举报