bzoj 4710: [Jsoi2011]分特产

bzoj 4710: [Jsoi2011]分特产


容斥,\(\sum_{i}(-1)^{i+1}C^{i}_{n}[\text{把物品分给至少i个人}]\)

但是\(\sum_{i}(-1)^{n-i}C^{i}_{n}[\text{把物品分给最多i个人}]\)也是对的

直接枚举,组合数算一下就好了

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 1000000007
typedef long long ll;
il int gi(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
	return x*f;
}
il int pow(int x,int y){
	int ret=1;
	while(y){
		if(y&1)ret=ret*x%mod;
		x=x*x%mod;y>>=1;
	}
	return ret;
}
int C[2001][2001],a[1001];
int main(){
#ifndef ONLINE_JUDGE
	freopen("4710.in","r",stdin);
	freopen("4710.out","w",stdout);
#endif
	C[0][0]=1;
	for(int i=1;i<2001;++i){
		C[i][0]=1;
		for(int j=1;j<=i;++j)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	int n=gi(),m=gi();
	for(int i=1;i<=m;++i)a[i]=gi();
	ll ans=0,res,f=1;
	for(int i=n;i;--i){
		res=1;
		for(int j=1;j<=m;++j)res=res*C[a[j]+i-1][i-1]%mod;
		ans=(ans+res*f%mod*C[n][i]%mod)%mod;
		f=mod-f;
	}
	printf("%lld\n",ans);
	return 0;
}
posted @ 2018-10-03 15:03  菜狗xzz  阅读(133)  评论(0编辑  收藏  举报