CF961G Partitions

题目

什么神仙题啊

答案非常显然就是

\[\sum_{i=1}^nw_i\times \sum_{i=1}^ni\binom{n-1}{i-1}S_2(n-i,k-1) \]

这是因为考虑到每一个\(w_i\)的地位都是对等的,于是每一个\(w_i\)被计算进总答案的系数都是相同的,我们算一下那个系数就好了,显然就是枚举有多少个和当前分到了一组,之后剩下的用第二类斯特林数把剩下的分配到\(k-1\)组里去就好了

之后根据第二类斯特林数的容斥形式,我们能把后面的那个柿子变成

\[\sum_{j=0}^{k-1}\frac{(-1)^j}{j!(k-1-j)!}\sum_{i=1}^n\frac{(n-1)!i}{(n-i)!(i-1)!}(k-1-j)^{n-i} \]

推不动了告辞

之后就是抄yyb的了

我们着重搞后面那个柿子,也就是

\[\begin{aligned} &\ \ \ \sum_{i=1}^n\frac{(n-1)!i}{(n-i)!(i-1)!}(k-1-j)^{n-i}\\&=\sum_{i=1}^n\frac{(n-1)!(i-1+1)}{(n-i)!(i-1)!}(k-1-j)^{n-i}\\&=\sum_{i=1}^n\frac{(n-1)!}{(n-i)!(i-1)!}(k-1-j)^{n-i}+\sum_{i=1}^n\frac{(n-1)!}{(n-i)!(i-2)!}(k-1-j)^{n-i}\\&=\sum_{i=1}^n\frac{(n-1)!}{(n-i)!(i-1)!}(k-1-j)^{n-i}+(n-1)\sum_{i=1}^n\frac{(n-2)!}{(n-i)!(i-2)!}(k-1-j)^{n-i}\\&=\sum_{i=0}^{n-1}\binom{n-1}{n-i}(k-1-j)^{n-i}1^{i-1}+(n-1)\sum_{i=0}^{n-2}\binom{n-2}{n-i}(k-1-j)^{n-i}1^{i-2}+(n-1)\\&=(k-j)^{n-1}+(n-1)(k-j)^{n-2}\\&=(k-j+n-1)(k-j)^{n-2}\end{aligned} \]

最后整体的柿子就是

\[\sum_{j=0}^{k-1}\frac{(-1)^j}{j!(k-1-j)!}(k-j+n-1)(k-j)^{n-2} \]

代码

#include<cstdio>
#define re register
const int maxn=2e5+5;
const int mod=1e9+7;
inline int ksm(int a,int b) {
	int S=1;for(;b>0;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;return S;
}
int n,k,ans,sum,fac[maxn],ifac[maxn];
int main() {
	scanf("%d%d",&n,&k);
	fac[0]=1;ifac[0]=1;
	for(re int i=1;i<k;i++) fac[i]=1ll*fac[i-1]*i%mod;
	ifac[k-1]=ksm(fac[k-1],mod-2);
	for(re int i=k-2;i>=0;--i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
	for(re int j=0;j<k;j++) {
		int now=1ll*ifac[j]*ifac[k-1-j]%mod;
		now=1ll*now*(n+k-j-1)%mod*ksm(k-j,n-2)%mod;
		ans=(ans+((j&1)?-1:1)*now)%mod;
	}
	ans=(ans+mod)%mod;
	for(re int x,i=0;i<n;i++) scanf("%d",&x),sum=(sum+x)%mod;
	printf("%d\n",1ll*sum*ans%mod);
	return 0;
}
posted @ 2019-05-23 21:32  asuldb  阅读(372)  评论(0编辑  收藏  举报