CF961G Partitions

题目

什么神仙题啊

答案非常显然就是

[sum_{i=1}^nw_i imes sum_{i=1}^niinom{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}^nfrac{(n-1)!i}{(n-i)!(i-1)!}(k-1-j)^{n-i} ]

推不动了告辞

之后就是抄yyb的了

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

[egin{aligned} & sum_{i=1}^nfrac{(n-1)!i}{(n-i)!(i-1)!}(k-1-j)^{n-i}\&=sum_{i=1}^nfrac{(n-1)!(i-1+1)}{(n-i)!(i-1)!}(k-1-j)^{n-i}\&=sum_{i=1}^nfrac{(n-1)!}{(n-i)!(i-1)!}(k-1-j)^{n-i}+sum_{i=1}^nfrac{(n-1)!}{(n-i)!(i-2)!}(k-1-j)^{n-i}\&=sum_{i=1}^nfrac{(n-1)!}{(n-i)!(i-1)!}(k-1-j)^{n-i}+(n-1)sum_{i=1}^nfrac{(n-2)!}{(n-i)!(i-2)!}(k-1-j)^{n-i}\&=sum_{i=0}^{n-1}inom{n-1}{n-i}(k-1-j)^{n-i}1^{i-1}+(n-1)sum_{i=0}^{n-2}inom{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
",1ll*sum*ans%mod);
	return 0;
}
原文地址:https://www.cnblogs.com/asuldb/p/10914682.html