[省选联考 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)\) 是怎么来的:

  1. \(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。
  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;
}
posted @ 2021-03-03 19:07  zYzYzYzYz  阅读(72)  评论(0编辑  收藏  举报