Lucas 定理学习笔记

一、定理

给定 \(n,m,p\)\(p\) 是质数,求 \(C_{m+n}^n\bmod p\)\(n,m\le 10^{18},p\le 10^6\)
这题可以用 Lucas 定理求解。
Lucas 定理:
\(p\) 是个质数时,\(\forall m,n\in N,C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}\times C_{n\bmod p}^{m\bmod p}\pmod{p}\)

要证明这个结论,要先证明一个引理:
\(p\) 是个质数时,\((1+x)^p\equiv 1^p+x^p\pmod{p}\)
为什么?我们知道,\(\forall n\in [0,p],C_p^n=\frac{p!}{n!\times(p-n)!}\)。由于 \(p\) 是个质数,所以分子的质因数中有且仅有 1 个 \(p\)

  1. \(n=0\)\(n=p\) 此时分母也有 1 个 \(p\),并且 \(C_p^n=1\)
  2. \(0<n<p\),此时分母没有质因数 \(p\),所以此时 \(C_p^n\equiv 0\pmod p\)

然后我们用二项式定理拆开:
\((1+x)^p\equiv\sum\limits_{i=0}\limits^{p}C_p^i\times 1^{p-i}\times x^i\)
\(\equiv\sum\limits_{i=0}\limits^{p}C_p^i\times x^i\)
\(\equiv C_p^0\times x^0+C_p^p\times x^p\)
\(\equiv 1+x^p\pmod{p}\)
这样,引理就证完了。

然后就是 Lucas 定理了。

我们知道,\(C_n^m\) 可以代表 \((1+x)^n\)\(m\) 次项的系数。
假设 \(n=a\times p+b,m=c\times p+d,b,d\in [0,p-1]\)
那么 \((1+x)^n\equiv (1+x)^{a\times p}\times (1+x)^b\)
\(\equiv ((1+x)^p)^a\times (1+x)^b\)
\(\equiv (1+x^p)^a\times (1+x)^b\)

然后考虑 \(m\) 次项的系数,
\(C_n^m x^m\equiv C_a^c x^{p\times c}\times C_b^d x^d\pmod p\)
所以就知道 \(C_n^m\equiv C_a^c\times C_b^d\pmod p\)
也就是 \(C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}\times C_{n\bmod p}^{m\bmod p}\pmod p\)。□

时间复杂度:预处理 \(O(p)\),单次计算 \(O(\log p)\)

二、代码

inline void exgcd(ll &x,ll &y,ll a,ll b){
	if(!b){x=1;y=0;return;}
	exgcd(y,x,b,a%b);y-=a/b*x;
}
inline ll lucas(ll x,ll y){
	if(x<y)return 0;
	if(x<p)return a[x]*b[y]*b[x-y]%p;
	return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
int main(){
	cin>>t;a[0]=b[0]=a[1]=b[1]=1;
	while(t--){
		cin>>n>>m>>p;
		for(ll i=2;i<p;i++)a[i]=a[i-1]*i%p;
		for(ll i=2;i<p;i++)b[i]=(p-p/i)*b[p%i]%p;
		for(ll i=2;i<p;i++)b[i]=b[i-1]*b[i]%p;
		cout<<lucas(n+m,n)<<'\n'; 
	}
	return 0;
}

三、推论

\(C_n^m\) 是质数 \(p\) 的倍数当且仅当 \(n\)\(p\) 进制下有一位小于 \(m\)

证明:假设 \((n)_p=\overline{a_0a_1…a_b},(m)_p=\overline{c_0c_1…c_d}\)
那么反复使用 Lucas 定理,知 \(C_n^m \equiv\prod\limits_{i=0}\limits^{\max\{b,d\}} C_{a_i}^{c_i}\),多余位补 \(0\)

然后如果存在 \(c_k>a_k\),则 \(C_{a_k}^{c_k}\equiv 0\pmod p\),所以 \(C_n^m \equiv\prod\limits_{i=0}\limits^{\max\{b,d\}} C_{a_i}^{c_i}\equiv 0\pmod p\)

如果 \(\forall i\in [0,max\{b,d\}]\),都有 \(a_i\ge c_i\),那么由于 \(c_i\le a_i<p\),所以 \(\gcd(C_{a_i}^{c_i},p)=1\),所以 \(C_n^m\not\equiv 0\pmod p\)。□

posted @ 2023-05-10 13:28  lrxQwQ  阅读(44)  评论(0)    收藏  举报