一、定理
给定 \(n,m,p\),\(p\) 是质数,求 \(C_{m+n}^n\bmod p\),\(n,m\le 10^{18},p\le 10^6\)。
这题可以用 Lucas 定理求解。
Lucas 定理:
当 \(p\) 是个质数时,\(\forall m,n\in N,C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}\times C_{n\bmod p}^{m\bmod p}\pmod{p}\)。
要证明这个结论,要先证明一个引理:
当 \(p\) 是个质数时,\((1+x)^p\equiv 1^p+x^p\pmod{p}\)。
为什么?我们知道,\(\forall n\in [0,p],C_p^n=\frac{p!}{n!\times(p-n)!}\)。由于 \(p\) 是个质数,所以分子的质因数中有且仅有 1 个 \(p\)。
- \(n=0\) 或 \(n=p\) 此时分母也有 1 个 \(p\),并且 \(C_p^n=1\)。
- \(0<n<p\),此时分母没有质因数 \(p\),所以此时 \(C_p^n\equiv 0\pmod p\)。
然后我们用二项式定理拆开:
\((1+x)^p\equiv\sum\limits_{i=0}\limits^{p}C_p^i\times 1^{p-i}\times x^i\)
\(\equiv\sum\limits_{i=0}\limits^{p}C_p^i\times x^i\)
\(\equiv C_p^0\times x^0+C_p^p\times x^p\)
\(\equiv 1+x^p\pmod{p}\)
这样,引理就证完了。
然后就是 Lucas 定理了。
我们知道,\(C_n^m\) 可以代表 \((1+x)^n\) 的 \(m\) 次项的系数。
假设 \(n=a\times p+b,m=c\times p+d,b,d\in [0,p-1]\),
那么 \((1+x)^n\equiv (1+x)^{a\times p}\times (1+x)^b\)
\(\equiv ((1+x)^p)^a\times (1+x)^b\)
\(\equiv (1+x^p)^a\times (1+x)^b\)
然后考虑 \(m\) 次项的系数,
\(C_n^m x^m\equiv C_a^c x^{p\times c}\times C_b^d x^d\pmod p\)。
所以就知道 \(C_n^m\equiv C_a^c\times C_b^d\pmod p\),
也就是 \(C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}\times C_{n\bmod p}^{m\bmod p}\pmod p\)。□
时间复杂度:预处理 \(O(p)\),单次计算 \(O(\log p)\)。
二、代码
inline void exgcd(ll &x,ll &y,ll a,ll b){
if(!b){x=1;y=0;return;}
exgcd(y,x,b,a%b);y-=a/b*x;
}
inline ll lucas(ll x,ll y){
if(x<y)return 0;
if(x<p)return a[x]*b[y]*b[x-y]%p;
return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
int main(){
cin>>t;a[0]=b[0]=a[1]=b[1]=1;
while(t--){
cin>>n>>m>>p;
for(ll i=2;i<p;i++)a[i]=a[i-1]*i%p;
for(ll i=2;i<p;i++)b[i]=(p-p/i)*b[p%i]%p;
for(ll i=2;i<p;i++)b[i]=b[i-1]*b[i]%p;
cout<<lucas(n+m,n)<<'\n';
}
return 0;
}
三、推论
\(C_n^m\) 是质数 \(p\) 的倍数当且仅当 \(n\) 在 \(p\) 进制下有一位小于 \(m\)。
证明:假设 \((n)_p=\overline{a_0a_1…a_b},(m)_p=\overline{c_0c_1…c_d}\)。
那么反复使用 Lucas 定理,知 \(C_n^m \equiv\prod\limits_{i=0}\limits^{\max\{b,d\}} C_{a_i}^{c_i}\),多余位补 \(0\)。
然后如果存在 \(c_k>a_k\),则 \(C_{a_k}^{c_k}\equiv 0\pmod p\),所以 \(C_n^m \equiv\prod\limits_{i=0}\limits^{\max\{b,d\}} C_{a_i}^{c_i}\equiv 0\pmod p\)。
如果 \(\forall i\in [0,max\{b,d\}]\),都有 \(a_i\ge c_i\),那么由于 \(c_i\le a_i<p\),所以 \(\gcd(C_{a_i}^{c_i},p)=1\),所以 \(C_n^m\not\equiv 0\pmod p\)。□
标签:Lucas,limits,pmod,定理,笔记,times,ll,equiv From: https://www.cnblogs.com/qwq-qaq-tat/p/17387054.html