Lucas定理

若P为质数,则对于任意整数1<=m<=n,有:
C (n,m) = C (n%p, m%p) • C (n/p, m/p) (mod p)
相当于把n, m表示成p进制数,对P进制每一位计算组合数再相乘

时间复杂度:O()

ll ksm(ll a,ll b){...}

ll C(ll n,ll m)
{
    if(m>n) return 0;
    ll a=1,b=1;
    if(m>n-m) m=n-m;//C(n,m)=C(n,n-m)
    for(int i=1;i<=m;++i){
       a=a*(n-i)%mod;//(n!/(n-m)!)%mod
       b=b*i%mod;//(m!)%mod
    }
    return a*ksm(b,mod-2)%mod;//费马小定理
}

ll lucas(ll n,ll m)
{return !m||n==m?1:C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;}
上一篇:关于数论的一些知识


下一篇:Lucas学习笔记