扩展卢卡斯定理(exlucas)
参考 Fading 在 P4720 【模板】扩展卢卡斯定理 / exLucas 的题解。
求解问题:
对于给定的 \(n,m,P\),求:
其中不保证 \(P\) 为质数。
卢卡斯定理的局限性:
对于 卢卡斯定理,只能求解 \(P\) 为质素且 \(P\) 较小的问题,当 \(P\) 为合数时,不仅卢卡斯定理会爆掉,与其配套的费马小定理求逆元也会爆掉,所以不能使用卢卡斯定理。
扩展卢卡斯定理:
其实扩展卢卡斯定理与卢卡斯定理并没有什么关系,但需要预先了解中国剩余定理与扩展欧几里得。
我们知道,任何一个合数都可以表示为若干个质数幂的积:
那么我们是否可以将问题转化一下呢?
我们试着将 \(P\) 分解:
记要求的 \(C_n^m\) 的值为 \(b\),\(C_n^m\bmod p_i^{c_i}\) 的值为 \(a_i\),我们可以列出同余方程:
显然这是中国剩余定理干的事情。
那么我们的问题就变成了求(为了方便我去掉了 \(p\) 的下标):
就是求:
发现我们说了半天发现 \(\gcd(m!,p^c)\) 和\(\gcd((n-m)!,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!\) 展开:
将有关 \(p\) 的项提出来:
根据阶乘的性质可知 \(n!\) 中有 \(\lfloor\frac{n}{p}\rfloor\) 个。
所以我们就可以写成:
再看后面这一坨:
你发现了什么?什么也没有?那我们将每个数 \(\bmod p\) 试试:
这下是个人除非你不是都能看出来他在 \(\bmod p\) 的时候有循环节,那么我们就可以将其写成幂的形式:
其实后边这俩可以直接暴力求,前面这个 \(p^{\lfloor\frac{n}{p}\rfloor}\) 可以直接除去,我们的目的是将 \(n!\) 中 \(p\) 的因子除去,但现在这个 \((\lfloor\frac{n}{p}\rfloor)!\) 中可能还有 \(p\) ,这个好办,继续递归求解即可。我们设 \(f_n\) 为 \(\frac{n!}{p^x}\),则:
其中 \(f_0=1\)。
于是原来那个式子就变成了:
别急,还有问题,就是这个 \(p^{x-y-z}\) 该如何求?
我们设 \(g_x\) 为 \(\frac{n!}{p^x}\) 中的 \(x\),观察上面这个
就可以知道我们要求的是 \(\lfloor \frac{n}{p} \rfloor\) 但你要只求 \(\lfloor \frac{n}{p} \rfloor\) 就错了,因为你求 \(f_n\) 的时候用到了递归解决 \((\lfloor\frac{n}{p}\rfloor)!\) 中有 \(p\) 的问题,求 \(g_n\) 的时候就也需要用递归去求总幂:
这样你就得到了这样一个诡异式子:
聪明的你已经将分母部分所有 \(p\) 的因数干掉了,这下可以开开心心的使用扩展欧几里得求逆元了。
最后的最后,使用中国剩余定理合并一元线性同余方程组即可。

浙公网安备 33010602011771号