[省选联考 2020 A 卷] 组合数问题 题解
题目
求:
\[\left(\sum\limits_{k=0}^nf(k)\times x^k\times \dbinom{n}{k}\right)\bmod p
\]
其中:
\[f(k)=a_0+a_1k+a_2k^2+\cdot\cdot\cdot\ +a_mk^m
\]
\[\binom{n}{k}=\frac{n!}{k!(n-k)!}
\]
题解
吸收恒等式:
\[k\times\binom{n}{k}=n\times\binom{n-1}{k-1}
\]
二项式定理:
\[(x+1)^n=\sum\limits_{i=0}^n\binom{n}{i}x^i
\]
\[\begin{aligned}
原式&=\sum\limits_{k=0}^nf(k)\times x^k\times \dbinom{n}{k}\\
&=\sum\limits_{k=0}^n(a_0+a_1k+a_2k^2+\cdot\cdot\cdot\ +a_mk^m)\times x^k\times\binom{n}{k}\\
&=\sum\limits_{k=0}^n(\sum\limits_{i=0}^ma_ik^i) \times x^k\times\binom{n}{k}\\
&=\sum\limits_{i=0}^ma_i \left( \sum\limits_{k=0}^nk^i \times x^k\times\binom{n}{k}\right) \\
\end{aligned}
\]
对于每一个 \(a_i\) 只考虑第二个和式:
\[\sum\limits_{k=0}^nk^i \times x^k\times\binom{n}{k}=\sum\limits_{k=0}^nk^i \times\binom{n}{k}\times x^k
\]
单考虑前面两项 \(k^i\times\binom{n}{k}\) ,尝试对它使用吸收恒等式。
\[k\times\binom{n}{k}=n\times\binom{n-1}{k-1}\\
\]
\[\begin{aligned}
k^2\times\binom{n}{k}&=k\times n\times\binom{n-1}{k-1}\\
&=(k-1+1)\times n\times\binom{n-1}{k-1}\\
&=(k-1)\times n\times\binom{n-1}{k-1}+n\times\binom{n-1}{k-1}\\
&=n\times(n-1)\times\binom{n-2}{k-2}+n\times\binom{n-1}{k-1}
\end{aligned}
\]
\[\begin{aligned}
k^3\times\binom{n}{k}&=k\times\left(k^2\times\binom{n}{k}\right)\\
&=k\times\left(n\times(n-1)\times\binom{n-2}{k-2}+n\times\binom{n-1}{k-1}\right)\\
&=k\times n\times(n-1)\times\binom{n-2}{k-2}+k\times n\times\binom{n-1}{k-1}\\
&=(k-2+2)\times n\times(n-1)\times\binom{n-2}{k-2}+(k-1+1)\times n\times\binom{n-1}{k-1}\\
&=(k-2) n(n-1)\binom{n-2}{k-2}+2 n(n-1)\binom{n-2}{k-2}+(k-1) n\binom{n-1}{k-1}+n\binom{n-1}{k-1}\\
&=n(n-1)(n-2)\binom{n-3}{k-3}+2 n(n-1)\binom{n-2}{k-2}+n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}\\
&=n\times(n-1)\times(n-2)\times\binom{n-3}{k-3}+3\times n\times(n-1)\times\binom{n-2}{k-2}+n\times\binom{n-1}{k-1}\\
&=n^{\underline{2}}\times\binom{n-3}{k-3}+3\times n^{\underline{1}}\times\binom{n-2}{k-2}+n^{\underline{0}}\times\binom{n-1}{k-1}
\end{aligned}
\]
其中 \(n^{\underline{k}}\) 表示 \(n\) 的 \(k\) 阶下降幂,等于 \(\prod\limits_{i=0}^k(n-k)\)。
会发现:
\[\begin{aligned}
k^i\times\binom{n}{k}&=\sum\limits_{j=1}^{k}S(i,j)\times n^{\underline{j-1}}\times\binom{n-j}{k-j} \\
\end{aligned}
\]
其中 \(S(k,j)\) 表示一个系数,即 \(3\times n^{\underline{1}}\times\binom{n-2}{k-2}\) 中的 3。
考虑这个 \(S(k,j)\) 是怎么来的:
- \(k\times n\times(n-1)\times\binom{n-2}{k-2}\) 为了变成 \(n\times(n-1)\times(n-2)\times\binom{n-3}{k-3}\) 将 \(k\) 减去了 2,这个 2 给了 \(S(k,j)\),得到了 \(S(k-1,j)\) 倍个 2。
- \(k\times n\times\binom{n-1}{k-1}\) 为了变成 \(n^{\underline{1}}\times\binom{n-2}{k-2}\) 使用了吸收恒等式,\(S(k,j)\) 得到了 \(S(k-1,j-1)\) 倍的 1。
可以得出:
\[S(i,j)=i\times S(i-1,j)+S(i-1,j-1)
\]
这其实就是一个斯特林数,不过本题用不上太深奥的斯特林数知识,得出这个递推式就可以了。
所以:
\[\begin{aligned}
\sum\limits_{k=0}^nk^i \times x^k\times\binom{n}{k}&=\sum\limits_{k=0}^nk^i \times\binom{n}{k}\times x^k\\
&=\sum\limits_{k=0}^n\left(\sum\limits_{j=1}^{k}S(i,j)\times n^{\underline{j-1}}\times\binom{n-j}{k-j}\right)\times x^k\\
&=\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times \sum\limits_{k=1}^n\left(\binom{n-j}{k-j}\times x^k\right)\\
&=\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times \sum\limits_{k=j}^n\left(\binom{n-j}{k-j}\times x^k\right)\\
&=\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times \sum\limits_{k=j}^n\left(\binom{n-j}{k-j}\times x^{k-j}\times x^j\right)\\
&=\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times x^j\times \sum\limits_{k=j}^n\left(\binom{n-j}{k-j}\times x^{k-j}\right)\\
&=\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times x^j\times \sum\limits_{k'=0}^{n-j}\left(\binom{n-j}{k'}\times x^{k'}\right)\\
&=\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times x^j\times (x+1)^{n-j}\\
\end{aligned}
\]
第三个等式到第四个等式的变换中将 \(k=1\) 变为了 \(k=j\),因为 \(k<j\) 时 \(\binom{n-j}{k-j}\) 无意义,值为 0。
第六个等式到第七个等式的变换中令 \(k'=k-j\),然后发现第二个和式是二项式定理,因此变换到了第八个等式。
\[\begin{aligned}
原式&=\sum\limits_{i=0}^m a_i \left( \sum\limits_{k=0}^nk^i \times x^k\times\binom{n}{k}\right) \\
&=a_0\times(x+1)^n+\sum\limits_{i=1}^m a_i \left(\sum\limits_{j=1}^i S(i,j)\times n^{\underline{j-1}}\times x^j\times (x+1)^{n-j}\right)
\end{aligned}
\]
这是一个 \(O(m^2)\) 的运算。
当 \(i=0\) 时要特殊处理一下。
\[\begin{aligned}
&a_0\times\left( \sum\limits_{k=0}^nk^0 \times x^k\times\binom{n}{k}\right)\\
&=a_0\times\left( \sum\limits_{k=0}^nx^k\times\binom{n}{k}\right)\\
&=a_0\times(x+1)^n
\end{aligned}
\]
然后就可以愉快地切省选题了。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL N,X,P,M,a[1010],ans=0;
LL S[1010][1010],N_[1010],X_1[1010],Xmi[1010];
//N_[4] = N 的四阶下降幂
//X_1[5] = (X+1)^(N-5)
//Xmi[7] = X^7
inline LL read()
{
LL x=0,w=0;char ch=0;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return w?-x:x;
}
LL ksm(LL B,LL K,LL A=1)
{
for(;K;K>>=1,B=B*B%P)
if(K&1)A=A*B%P;
return A%P;
}
void prepare()
{
N_[0]=N;Xmi[0]=1;S[1][1]=1;
for(int i=1;i<=M;i++)N_[i]=N_[i-1]*(N-i)%P;
for(int i=0;i<=M;i++)X_1[i]=ksm(X+1,N-i);
for(int i=1;i<=M;i++)Xmi[i]=Xmi[i-1]*X%P;
for(int i=2;i<=M;i++)
for(int j=1;j<=i;j++)
S[i][j]=(S[i-1][j]*j+S[i-1][j-1])%P;
}
int main()
{
N=read();X=read();P=read();M=read();X%=P;
for(int i=0;i<=M;i++)a[i]=read();
prepare();
ans=a[0]*X_1[0]%P;
for(int i=1;i<=M;i++){
for(int j=1;j<=i;j++)
ans=(ans+a[i]*S[i][j]%P*N_[j-1]%P*Xmi[j]%P*X_1[j]%P)%P;
}
cout<<ans<<'\n';
return 0;
}