[省选联考 2020 A 卷] 组合数问题 题解

题目

求:

[left(sumlimits_{k=0}^nf(k) imes x^k imes dbinom{n}{k} ight)mod p ]

其中:

[f(k)=a_0+a_1k+a_2k^2+cdotcdotcdot +a_mk^m ]

[inom{n}{k}=frac{n!}{k!(n-k)!} ]

题解

吸收恒等式:

[k imesinom{n}{k}=n imesinom{n-1}{k-1} ]

二项式定理:

[(x+1)^n=sumlimits_{i=0}^ninom{n}{i}x^i ]

[egin{aligned} 原式&=sumlimits_{k=0}^nf(k) imes x^k imes dbinom{n}{k}\ &=sumlimits_{k=0}^n(a_0+a_1k+a_2k^2+cdotcdotcdot +a_mk^m) imes x^k imesinom{n}{k}\ &=sumlimits_{k=0}^n(sumlimits_{i=0}^ma_ik^i) imes x^k imesinom{n}{k}\ &=sumlimits_{i=0}^ma_i left( sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k} ight) \ end{aligned} ]

对于每一个 (a_i) 只考虑第二个和式:

[sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k}=sumlimits_{k=0}^nk^i imesinom{n}{k} imes x^k ]

单考虑前面两项 (k^i imesinom{n}{k}) ,尝试对它使用吸收恒等式。

[k imesinom{n}{k}=n imesinom{n-1}{k-1}\ ]

[egin{aligned} k^2 imesinom{n}{k}&=k imes n imesinom{n-1}{k-1}\ &=(k-1+1) imes n imesinom{n-1}{k-1}\ &=(k-1) imes n imesinom{n-1}{k-1}+n imesinom{n-1}{k-1}\ &=n imes(n-1) imesinom{n-2}{k-2}+n imesinom{n-1}{k-1} end{aligned} ]

[egin{aligned} k^3 imesinom{n}{k}&=k imesleft(k^2 imesinom{n}{k} ight)\ &=k imesleft(n imes(n-1) imesinom{n-2}{k-2}+n imesinom{n-1}{k-1} ight)\ &=k imes n imes(n-1) imesinom{n-2}{k-2}+k imes n imesinom{n-1}{k-1}\ &=(k-2+2) imes n imes(n-1) imesinom{n-2}{k-2}+(k-1+1) imes n imesinom{n-1}{k-1}\ &=(k-2) n(n-1)inom{n-2}{k-2}+2 n(n-1)inom{n-2}{k-2}+(k-1) ninom{n-1}{k-1}+ninom{n-1}{k-1}\ &=n(n-1)(n-2)inom{n-3}{k-3}+2 n(n-1)inom{n-2}{k-2}+n(n-1)inom{n-2}{k-2}+ninom{n-1}{k-1}\ &=n imes(n-1) imes(n-2) imesinom{n-3}{k-3}+3 imes n imes(n-1) imesinom{n-2}{k-2}+n imesinom{n-1}{k-1}\ &=n^{underline{2}} imesinom{n-3}{k-3}+3 imes n^{underline{1}} imesinom{n-2}{k-2}+n^{underline{0}} imesinom{n-1}{k-1} end{aligned} ]

其中 (n^{underline{k}}) 表示 (n)(k) 阶下降幂,等于 (prodlimits_{i=0}^k(n-k))

会发现:

[egin{aligned} k^i imesinom{n}{k}&=sumlimits_{j=1}^{k}S(i,j) imes n^{underline{j-1}} imesinom{n-j}{k-j} \ end{aligned} ]

其中 (S(k,j)) 表示一个系数,即 (3 imes n^{underline{1}} imesinom{n-2}{k-2}) 中的 3。

考虑这个 (S(k,j)) 是怎么来的:

  1. (k imes n imes(n-1) imesinom{n-2}{k-2}) 为了变成 (n imes(n-1) imes(n-2) imesinom{n-3}{k-3})(k) 减去了 2,这个 2 给了 (S(k,j)),得到了 (S(k-1,j)) 倍个 2。
  2. (k imes n imesinom{n-1}{k-1}) 为了变成 (n^{underline{1}} imesinom{n-2}{k-2}) 使用了吸收恒等式,(S(k,j)) 得到了 (S(k-1,j-1)) 倍的 1。

可以得出:

[S(i,j)=i imes S(i-1,j)+S(i-1,j-1) ]

这其实就是一个斯特林数,不过本题用不上太深奥的斯特林数知识,得出这个递推式就可以了。

所以:

[egin{aligned} sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k}&=sumlimits_{k=0}^nk^i imesinom{n}{k} imes x^k\ &=sumlimits_{k=0}^nleft(sumlimits_{j=1}^{k}S(i,j) imes n^{underline{j-1}} imesinom{n-j}{k-j} ight) imes x^k\ &=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes sumlimits_{k=1}^nleft(inom{n-j}{k-j} imes x^k ight)\ &=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes sumlimits_{k=j}^nleft(inom{n-j}{k-j} imes x^k ight)\ &=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes sumlimits_{k=j}^nleft(inom{n-j}{k-j} imes x^{k-j} imes x^j ight)\ &=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes sumlimits_{k=j}^nleft(inom{n-j}{k-j} imes x^{k-j} ight)\ &=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes sumlimits_{k'=0}^{n-j}left(inom{n-j}{k'} imes x^{k'} ight)\ &=sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes (x+1)^{n-j}\ end{aligned} ]

第三个等式到第四个等式的变换中将 (k=1) 变为了 (k=j),因为 (k<j)(inom{n-j}{k-j}) 无意义,值为 0。

第六个等式到第七个等式的变换中令 (k'=k-j),然后发现第二个和式是二项式定理,因此变换到了第八个等式。

[egin{aligned} 原式&=sumlimits_{i=0}^m a_i left( sumlimits_{k=0}^nk^i imes x^k imesinom{n}{k} ight) \ &=a_0 imes(x+1)^n+sumlimits_{i=1}^m a_i left(sumlimits_{j=1}^i S(i,j) imes n^{underline{j-1}} imes x^j imes (x+1)^{n-j} ight) end{aligned} ]

这是一个 (O(m^2)) 的运算。

(i=0) 时要特殊处理一下。

[egin{aligned} &a_0 imesleft( sumlimits_{k=0}^nk^0 imes x^k imesinom{n}{k} ight)\ &=a_0 imesleft( sumlimits_{k=0}^nx^k imesinom{n}{k} ight)\ &=a_0 imes(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<<'
';
	return 0;
}
原文地址:https://www.cnblogs.com/zYzYzYzYz/p/14476342.html