前言:
可以用来计算 $C_{n}^{m}\%p$
正文:
卢卡斯定理
卢卡斯定理适用于模数 $p$ 为质数的情况
首先我们知道组合数的计算公式
$C_{n}^{m}=dfrac{n!}{m!;(n-m)!}$
所以我们可以先递推出阶乘
再用快速幂或 $EXGCD$ 计算逆元
也可以直接递推阶乘逆元
然后就可以计算 $C$ 了
ll qpow(ll a,int b,int p) { ll ans=1,base=a%p; while(b) { if(b&1) ans=ans*base%p; base=base*base%p; b>>=1; } return ans; } ll jc[maxn]; ll C(ll n,ll m,int p) { if(n<m) return 0; return (jc[n]*qpow(jc[m],p-2,p)%p)*qpow(jc[n-m],p-2,p)%p; }
然后可以直接套用卢卡斯定理的公式
$C_{n}^{m}\%p=C_{n\%p}^{m\%p} imes C_{n/p}^{m/p};\%;p$
ll Lucas(ll n,ll m,int p) { if(!m) return 1; return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p; }
扩展卢卡斯定理
扩展卢卡斯定理可以计算模数 $p$ 不是质数的情况
后序:
个人感觉卢卡斯定理除了过板子之外并没有什么用
然而好像不会有人去考板子,所以它算是死了吧