跳转至

卢卡斯定理

前置知识:阶乘取模

引入

本文讨论大组合数取模的求解。组合数,又称二项式系数,指表达式:

\[ \binom{n}{k} = \dfrac{n!}{k!(n-k)!}. \]

规模不大时,组合数可以通过 递推公式 求解,时间复杂度为 \(O(nk)\);也可以在较大的素数模数 \(p>n\) 下,通过计算分子和分母的阶乘在 \(O(n)\) 时间内求解。但当问题规模很大(\(n\sim 10^{18}\))时,这些方法不再适用。

基于 Lucas 定理及其推广,本文讨论一种可以在模数不太大 (\(m \sim 10^6\)) 时求解组合数的方法。更准确地说,只要模数的唯一分解 \(m=\prod p_i^{e_i}\) 中所有素数幂的和(即 \(\sum p_i^{e_i}\))在 \(10^6\) 规模时就可以使用该方法,因为算法的预处理大致相当于这一规模。

Lucas 定理

首先讨论模数为素数 \(p\) 的情形。此时,有 Lucas 定理:

Lucas 定理

对于素数 \(p\),有

\[ \binom{n}{k}\equiv \binom{\lfloor n/p\rfloor}{\lfloor k/p\rfloor}\binom{n\bmod p}{k\bmod p}\pmod p. \]

其中,当 $n