Lucas/exLucas 定理 学习笔记
0x00 前言
Lucas 定理适用于求在模质数 \(p\) 意义下的组合数(exLucas 不需要质数的条件)。此时 \(p\) 一般不大,但 \(n,m\) 很大,无法通过常规的方法预处理(一是空间可能开不下,二是如果 \(m>p\),则 \(n-m\) 和 \(m\) 不一定有逆元)。
当然你可以用杨辉三角递推,但这是 \(\mathcal{O}(n^2)\) 的。
0x01 方法
先上结论,当 \(p\) 为质数时,有 \(\dbinom{n}{m}\equiv\dbinom{\left\lfloor\dfrac{n}{p}\right\rfloor}{\left\lfloor\dfrac{m}{p}\right\rfloor}\times\dbinom{n\bmod p}{m\bmod p}\pmod{p}\)。当 \(n<m\) 时,规定 \(\dbinom{n}{m}=0\)。
0x02 原理
就是证明这个柿子。
引理:若 \(x\) 是小于质数 \(p\) 的正整数,则 \(\dbinom{p}{x}\equiv0\pmod{p}\)。
证明:因为 \(x<p\),则 \(x\) 存在关于 \(p\) 的逆元。那么有 \(\dbinom{p}{x}\equiv\dfrac{p!}{x!(p-x)!}\equiv\dfrac{(p-1)!}{(x-1)!(p-x)!}\times\dfrac{p}{x}\equiv\dbinom{p-1}{x-1}\times p\times\text{inv}(x)\pmod{p}\),得证。
根据二项式定理,得到 \((1+x)^n=\sum\limits_{i=0}^n\dbinom{n}{i}x^i\equiv1+x^n\pmod{p}\) 。
令 \(p_n=\left\lfloor\dfrac{n}{p}\right\rfloor,q_n=n\bmod p,p_m=\left\lfloor\dfrac{m}{p}\right\rfloor,q_m=m\bmod p\)。
对比系数就可以得到上式。
0x03 实现
可以通过递归的方式实现。
点击查看代码
int C(int n,int m,int p){
if(n<0||m<0||n-m<0)return 0;
return jc[n]*ij[m]%p*ij[n-m]%p;
}
int Lucas(int n,int m,int p){
if(n==0)return 1;
return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
时间复杂度 \(\mathcal{O}(p+\log_p n)\)(线性预处理 \(p\) 以内的逆元)。
0x04 拓展
当 \(p\) 不为质数时,需要用到 exLucas 定理。
待补。https://oi.wiki/math/number-theory/lucas/
0x05 应用
P3807 【模板】卢卡斯定理/Lucas 定理
板。
P1313 [NOIP2011 提高组] 计算系数
二项式定理。