您的位置:首页 > Web前端 > JavaScript

bzoj 4710: [Jsoi2011]分特产

2017-12-20 13:44 239 查看

题意:

将m种不同特产分给n个人,每种物品a[i]个,每个人多要有至少一个特产。问方案数。

题解:

傻逼题。

假如可以有人没有,那么就是ΠniCn−1n+a[i]−1

然后容斥减不合法的就没有了。

code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
const LL mod=1000000007;
LL C[2010][2010],n,m,a[1010];
void pre()
{
for(LL i=0;i<=2000;i++)
{
C[i][0]=1;
for(LL j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
}
LL solve(LL x)
{
LL ans=1;
for(LL i=1;i<=m;i++)
ans=ans*C[x+a[i]-1][x-1]%mod;
return ans;
}
int main()
{
pre();
scanf("%lld %lld",&n,&m);
for(LL i=1;i<=m;i++) scanf("%lld",&a[i]);
LL ans=0;
for(LL i=1;i<=n;i++)
{
LL tmp=solve(i);
if((i&1)==(n&1)) ans=(ans+tmp*C
[i]%mod)%mod;
else ans=(ans-tmp*C
[i]%mod)%mod;
(ans+=mod)%=mod;
}
printf("%lld",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: