1. 程式人生 > 實用技巧 >盧卡斯定理

盧卡斯定理

盧卡斯定理

\[\large\binom{n}{m}\equiv\binom{n \bmod p}{m\bmod p}\binom{\frac{n}{p}}{\frac{m}{p}} \pmod{p} \]

其中 \(p\) 為質數。

即將 \(n,m\)\(p\) 進位制來表示。

擴充套件盧卡斯定理

考慮當 \(p\) 不為質數時要如何解決。

\(p=\prod p_i^{k_i}\),得:

\[\large\begin{cases} x\equiv \binom{n}{m} &\pmod{p_1^{k_1}} \\ x\equiv \binom{n}{m} &\pmod{p_2^{k_2}} \\ &\cdots \\ x\equiv \binom{n}{m} &\pmod{p_m^{k_m}} \\ \end{cases} \]

求值後用中國剩餘定理合併即可。

ll fac(ll x,ll p,ll k)
{
    if(!x) return 1;
    ll ans=1;
    for(ll i=1;i<=k;++i)
        if(i%p)
            ans=ans*i%k;
    ans=qp(ans,x/k,k);
    for(ll i=1;i<=x%k;++i)
        if(i%p)
            ans=ans*i%k;
    return ans*fac(x/p,p,k)%k;
}
ll C(ll n,ll m,ll p,ll k)
{
    ll sum=0;
    for(ll i=n;i;i=i/p) sum+=i/p;
    for(ll i=m;i;i=i/p) sum-=i/p;
    for(ll i=n-m;i;i=i/p) sum-=i/p;
    return fac(n,p,k)*qp(p,sum,k)%k*inv(fac(m,p,k),k)%k*inv(fac(n-m,p,k),k)%k;
}
ll crt(ll x,ll M,ll p)
{
    return x*inv(M/p,p)*(M/p);
}
ll exlucas(ll n,ll m,ll p)
{
    ll t=p,ans=0;
    for(ll i=2;i*i<=p;++i)
    {
        ll k=1;
        while(t%i==0) t/=i,k*=i;
        ans=(ans+crt(C(n,m,i,k),p,k))%p;
    }
    if(t>1) ans=(ans+crt(C(n,m,t,t),p,t))%p;
    return ans;
}