卢卡斯定理
Lucas定理是用于处理组合数取模的定理,通常用于解决阶乘无法解决的问题。
本质上来说,卢卡斯定理是一类处理当组合数 \(C_{n}^{m} \mod p\) 中 \(n,m,p\) 皆为 \(10^5\) 范围内的数时求解答案的方法。
当 \(n,m,p\) 较小的时候可以考虑使用杨辉三角递推得到,但是此时用这种方法显然不能很好的解决此问题,所以我们考虑寻找一种更优的方法来减少运算,使得运算的难度降低。
首先给出卢卡斯定理
\[C_{n}^{m} \bmod p=C_{n / p}^{m / p} * C_{n \mod p}^{m \mod p} \bmod p
\]
证明
设 \(n = a \cdot p + b , m = c \cdot p + d (b,d < p , a = \left \lfloor \frac{n}{p} \right \rfloor , c = \left \lfloor \frac{m}{p} \right \rfloor )\)
首先,由费马小定理得,对于任意整数:$$ (1+x)^p \equiv 1+x \equiv 1 + x^p (\bmod p )$$ $$\Rightarrow(1+x)^n = (1+x)^{\left \lfloor \frac{n}{p} \right \rfloor \times p}\times (1+x)^b$$
\[\Rightarrow \sum_{i=0}^{\left \lfloor \frac{n}{p} \right \rfloor} C_{\left \lfloor \frac{n}{p} \right \rfloor}^{i} X^{pi} \times \sum_{k=0}^{b}C_{b}^{k} \times X^k
\]
观察 \(X^m\) 这一项 \(\Rightarrow p \cdot i + k = m\)
\[\Rightarrow LHS = C_{n}^{m}
\]
\[\Rightarrow RHS = C_{\left \lfloor \frac{n}{p} \right \rfloor }^{i} \times C_{b}^{k} = C_{\left \lfloor \frac{n}{p} \right \rfloor }^{\left \lfloor \frac{m}{p} \right \rfloor } \times C_{b}^{d}
\]
故可以推出
\[C_{n}^{m} \bmod p=C_{n / p}^{m / p} * C_{n \mod p}^{m \mod p} \bmod p
\]
证毕。
inline int qpow(int a,int b){
int res=1;
while(b){
if(b&1){
res*=a,res%=p;
}
a*=a,a%=p;
b>>=1;
}
return res;
}
inline int C(int n,int m){
if(n < m) return 0;
if(m > n - m) m = n - m;
int a = 1 , b = 1;
for(int i=0;i<m;i++){
a = (a * (n - i)) % p;
b = (b * (i + 1)) % p;
}
return a * qpow(b,p-2) % p;
}
inline int Lucas(int n,int m){
if(m == 0) return 1;
return Lucas(n/p,m/p) * C(n % p , m % p) % p;
}
浙公网安备 33010602011771号