CF891E Lust gxy001

首先,有一个显而易见的结论,我们要求的答案是原数组的乘积减去 kk 次操作后数组的乘积的期望。

我们设每个数被选中的次数为 bib_i,则我们要求的是 E(i=1n(aibi))E(\prod\limits_{i=1}^n(a_i-b_i)),如果枚举所有种类的 bib_i,即 1nkk!i=1n(aibi)bi!\frac{1}{n^k}k!\prod_{i=1}^n\frac{(a_i-b_i)}{b_i!} 我们写出后面这个东西的生成函数:

Fk(x)=i=0(aki)xii!=i=0akxii!i=0ixii!=aki=0xii!xi=0xii!=(akx)ex\begin{aligned} F_k(x)=&\sum\limits_{i=0}^\infin\frac{(a_k-i)x^i}{i!}\\ =&\sum\limits_{i=0}^\infin\frac{a_kx^i}{i!}-\sum\limits_{i=0}^\infin\frac{ix^i}{i!}\\ =&a_k\sum\limits_{i=0}^\infin\frac{x^i}{i!}-x\sum\limits_{i=0}^\infin\frac{x^i}{i!}\\ =&(a_k-x)e^x\\ \end{aligned}

我们要求的就是 [xk]i=1nFi(x)=[xk](enxi=1n(aix))=[xk]((i=0nixii!)i=1n(aix))[x^k]\prod\limits_{i=1}^nF_i(x)=[x^k] (e^{nx}\prod\limits_{i=1}^n(a_i-x))=[x^k] ((\sum\limits_{i=0}^\infin\frac{n^ix^i}{i!})\prod\limits_{i=1}^n(a_i-x))

i=1n(aix)\prod\limits_{i=1}^n(a_i-x) 是一个 nn 次多项式,本题中可以暴力计算,所以我们将其写成 i=0nfixi\sum\limits_{i=0}^nf_ix^i 的形式。

答案即为

1nkk!i=0nfinki(ki)!=i=0nfiniki\frac{1}{n^k}k!\sum\limits_{i=0}^nf_i\frac{n^{k-i}}{(k-i)!}=\sum\limits_{i=0}^nf_in^{-i}k^{\underline{i}}

最后记得用 i=1nai\prod\limits_{i=1}^na_i 减去即可。

#include<cstdio>
#include<algorithm>
int const mod=1e9+7;
int n,k,prod=1,a[5010],b[5010];
int pow(int x,int y){
	int res=1;
	while(y){
		if(y&1)res=1ll*res*x%mod;
		x=1ll*x*x%mod,y>>=1;
	}
	return res;
}
int main(){
	scanf("%d%d",&n,&k);
	a[0]=1;
	for(int x,i=1;i<=n;i++){
		scanf("%d",&x);
		prod=1ll*prod*x%mod;
		for(int j=0;j<i;j++)b[j]=1ll*a[j]*x%mod;
		for(int j=0;j<i;j++)b[j+1]=(b[j+1]+(mod-1ll)*a[j])%mod;
		std::swap(a,b);
	}
	for(int i=0,fac=1;i<=n;fac=1ll*fac*(k-i)%mod,i++) prod=(prod+(mod-1ll)*a[i]%mod*pow(pow(n,mod-2),i)%mod*fac)%mod;
	printf("%d\n",prod);
	return 0;
}
Powered By Valine
v1.4.14
欢迎来到本站!