卢卡斯定理(模数较小,且是质数)
式子C(m,n)=C(m/p,n/p)*C(m%p,n%p)%p
至于证明(我也不会QAQ,只要记住公式也该就好了)。
同时卢卡斯定理一般用于组合数取模上
1.首先当组合数取得模较大时,我们可以使用卢卡斯,也可以直接求
(只要数据范围不是很大,还能开得起数组,我们可以直接预处理出阶乘,逆元,需要时O(1)求,当然要是质数,不然只能现求)。
2.当组合数的模很小时,我们只能用卢卡斯,
我们可以发现假如我们照旧求的话,可能有的阶乘直接被消成0了
这个时候直接用阶乘会不准确,那么只能lusca了
3.模数非质数时,例如多个质数相乘,我们先用质因数分解,在用中国剩余定理即可。
1 ll pow(ll x,ll y,ll mod) 2 { 3 ll ans=1; 4 if(y==0)return 1; 5 while(y) 6 { 7 if(y&1)ans=ans*x%mod; 8 x=x*x%mod; 9 y>>=1; 10 } 11 return ans%mod; 12 } 13 ll C(ll x,ll y,ll mod) 14 { 15 if(y>x)return 0; 16 if(y==0)return 1; 17 return jie[x]*pow(jie[y]*jie[x-y]%mod,mod-2,mod)%mod; 18 } 19 ll lus(ll x,ll y,ll mod) 20 { 21 if(y>x)return 0; 22 if(y==0)return 1; 23 return lus(x/mod,y/mod,mod)*C(x%mod,y%mod,mod)%mod; 24 }