卢卡斯定理

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;
}
posted @ 2022-05-27 16:17  0xFF_qwq  阅读(117)  评论(0)    收藏  举报