学习:Lucas定理

Posted pfy_pfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习:Lucas定理相关的知识,希望对你有一定的参考价值。

模板题

Lucas定理

在数论中,Lucas定理用于计算二项式系数\({\tbinom {m}{n}}\)被质数\(p\)除的所得的余数。

描述

\(p\)为素数,\(a,b\in N_+\),且
\[a=a_kp^k+a_{k-1}p^{k-1}+\cdots+a_1p+a_0\]
\[b=b_kp^k+b_{k-1}p^{k-1}+\cdots+b_1p+b_0\]
这里\(0\leq a_i,b_i\leq p-1\bigwedge a_i,b_i\in Z(i=0,1,2,3,\cdots,k)\)

则有:
\[C^a_b\equiv C^{b_k}_{a_k}\times C^{b_{k-1}}_{a_{k-1}}\times\cdots\times C^{b_0}_{a_0}{\pmod p}\]

等价形式

由于
\[a_kp^k+a_{k-1}p^{k-1}+\cdots+a_1p\equiv 0 \pmod p\]

\[a\equiv a_0 \pmod p\]
又因为\(a_0<p\),故
\[a\mod p=a_0\]
同理
\[b\mod p=b_0\]

\[C^{a_0}_{b_0}=C^{a\mod p}_{b\mod p}\]
又因为\(a_0<p\),故
\[\lfloor{\frac{a}{p}}\rfloor=a_kp^{k-1}+a_{k-2}p^{k-1}+\cdots+a_1\]
同理
\[\lfloor{\frac{b}{p}}\rfloor=b_kp^{k-1}+b_{k-2}p^{k-1}+\cdots+b_1\]

\[C^{\lfloor\frac{a}{p}\rfloor}_{\lfloor\frac{b}{p}\rfloor}=C^{b_k}_{a_k}\times C^{b_{k-1}}_{a_{k-1}}\times\cdots\times C^{b_1}_{a_1}\]

\[C^a_b\equiv C^{b_k}_{a_k}\times C^{b_{k-1}}_{a_{k-1}}\times\cdots\times C^{b_0}_{a_0}\equiv C^{\lfloor\frac{a}{p}\rfloor}_{\lfloor\frac{b}{p}\rfloor}\times C^{a\mod p}_{b\mod p} {\pmod p}\]
我们真正要用的,就是
\[C^a_b\equiv C^{\lfloor\frac{a}{p}\rfloor}_{\lfloor\frac{b}{p}\rfloor}\times C^{a\mod p}_{b\mod p}{\pmod p}\]

证明

对于素数\(n\)\(m\),满足\(1\le m\le n-1\), 二项式系数\(C^m_n=\frac{n!}{(n-m)!\cdot m!}=\frac{n(n-1)\cdots(n-m+1)}{m(m-1)\cdots1}\)可被\(n\)整除。由此可得,在母函数中
\[(1+x)^{p}=\sum_{i=0}^{p}(C^{i}_{p}x^{i})\equiv 1+x^{p}{\pmod {p}}\]

对于非负整数\(i\),若\((1+x)^{p^{i}}\equiv 1+x^{p^{i}}{\pmod {p}}\)对于\(i\le t(t\ge 1)\)时成立,则有\[(1+x)^{p^{t+1}}=(1+x)^{p^{t}\times p}=((1+x)^{p^t})^p=1+x^{p\times p^t}=1+x^{p^{t+1}}\]

对于任意非负整数\(i\),都有\((1+X)^{p^{i}}\equiv 1+X^{p^{i}}{\pmod {p}}\)

故对于任意非负整数\(m\)和素数\(p\),将\(m\)\(p\)进制表示,即\[m=\sum _{i=0}^{k}m_{i}p^{i},\]其中\(k\in N_+\)\(m_i\)为整数且\(0\le m_i\le p-1\)。注意到
\[{\begin{aligned}\sum _{n=0}^{m}{C^n_m}x^{n}&=(1+x)^{m}=\prod_{i=0}^{k}\left((1+x)^{p^{i}}\right)^{m_{i}}\\&\equiv \prod_{i=0}^{k}\left(1+x^{p^{i}}\right)^{m_{i}}=\prod _{i=0}^{k}\left(\sum _{n_{i}=0}^{m_{i}}{C_{m_{i}}^{n_{i}}}X^{n_{i}p^{i}}\right)\\&=\prod _{i=0}^{k}\left(\sum _{n_{i}=0}^{p-1}{C_{m_{i}}^{n_{i}}}X^{n_{i}p^{i}}\right)=\sum _{n=0}^{m}\left(\prod _{i=0}^{k}{C_{m_{i}}^{n_{i}}}\right)X^{n}{\pmod {p}},\end{aligned}}\]
其中\(n_i\)\(n\)\(p\)进制表达的第\(i\)位。此即证明了本定理。

所以代码如下

typedef long long LL;

LL mod;

inline LL pow(LL a,LL b)//快速幂是为了求逆元 
{
    LL ans=1;
    for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
    return ans;
}

struct Lucas
{
    LL farc[1000005];
    inline void prepare(LL a)
    {
        farc[0]=1;
        for(LL i=1;i<=a;++i)farc[i]=farc[i-1]*i%mod;
    }
    inline LL Csmall(LL m,LL n)//C(m,n)=(n!)/(m!*(n-m)!)
    {
        if(n<m)return 0;
        return farc[n]*pow(farc[m],mod-2)%mod*pow(farc[n-m],mod-2)%mod;//费马小定理求逆元 
    }
    inline LL C(LL m,LL n)
    {
        if(n<m) return 0;
        if(!n)  return 1;//Lucas的边界条件 
        return C(m/mod,n/mod)%mod*Csmall(m%mod,n%mod)%mod;//上面证明的Lucas定理 
    }
}Lu;

以上是关于学习:Lucas定理的主要内容,如果未能解决你的问题,请参考以下文章

Lucas定理学习(进阶中)

Lucas定理

怎样学好哲学(lucas+费马小定理)

lucas定理

数论Lucas定理

FZU 2020 组合 (Lucas定理)