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;