【BZOJ 4710】【JSOI 2011】分特产【计数&容斥】
2017-04-05 23:07
465 查看
【前言】
时间所剩不多了,我来大力学点计数的姿势。。。
【题意】
m种特产,每种a[i]个,分给n个同学,要求:1、恰好分完。2、每个同学至少一个。求方案数。(n,m,a[i]<1000)
【题解】
先考虑就是将这么多特产分给n个人,分开来每一种特产,有a[i]个,分给n个人,用隔板法,答案是 C(a[i],n+a[i]-1)。所有的特产合起来就是这些值得乘积。
但是这样显然有一些不合法的状态,所以再容斥一下下。
ans=至少0个同学没分到-至少1个同学没分到+至少2个……-至少3个…………
所以直接枚举至少有多少个同学没分到。例如有x个同学没分到,那就是将a[i]分给n-x个同学,再算上从n个人中任意挑选x个同学,就是C(a[i],n-x+a[i]-1)* C(x,n)
这样就很简单了吧。。。
【代码】
时间所剩不多了,我来大力学点计数的姿势。。。
【题意】
m种特产,每种a[i]个,分给n个同学,要求:1、恰好分完。2、每个同学至少一个。求方案数。(n,m,a[i]<1000)
【题解】
先考虑就是将这么多特产分给n个人,分开来每一种特产,有a[i]个,分给n个人,用隔板法,答案是 C(a[i],n+a[i]-1)。所有的特产合起来就是这些值得乘积。
但是这样显然有一些不合法的状态,所以再容斥一下下。
ans=至少0个同学没分到-至少1个同学没分到+至少2个……-至少3个…………
所以直接枚举至少有多少个同学没分到。例如有x个同学没分到,那就是将a[i]分给n-x个同学,再算上从n个人中任意挑选x个同学,就是C(a[i],n-x+a[i]-1)* C(x,n)
这样就很简单了吧。。。
【代码】
#include<bits/stdc++.h> #define mod 1000000007 #define N 1010 using namespace std; typedef long long ll; ll c[N*2][N*2],ans; int n,m,a ,mx; inline int _max(int x,int y) { return x > y ? x : y; } void get_C() { int r = n+mx-1; for(int i = 0;i <= r;i++) c[i][0] = 1; for(int i = 0;i <= r;i++) c[0][i] = 1; for(int i = 1;i <= r;i++) for(int j = 1;j <= r;j++) c[i][j] = (c[i-1][j]+c[i][j-1]) % mod; } ll comp(int v) { ll ret = c[v][n-v]; if(v & 1) ret = -ret; for(int i = 1;i <= m;i++) ret = ret * c[a[i]][n-1-v] % mod; return ret; } int main() { scanf("%d%d",&n,&m); mx = -1; for(int i = 1;i <= m;i++) { scanf("%d",&a[i]); mx = max(mx,a[i]); } get_C(); for(int i = 0;i <= n;i++) { ans = (ans + comp(i)) % mod; if(ans < 0) ans += mod*(-ans/mod+1); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 【BZOJ4710】[Jsoi2011]分特产 组合数+容斥
- [bzoj4710][JSOI2011]分特产
- [BZOJ4710][Jsoi2011]分特产(容斥原理+组合数学)
- bzoj4710 [Jsoi2011]分特产 容斥原理
- ●BZOJ 4710 [Jsoi2011]分特产
- bzoj 4710: [Jsoi2011]分特产
- bzoj 4710: [Jsoi2011]分特产 排列组合+容斥原理
- bzoj千题计划273:bzoj4710: [Jsoi2011]分特产
- 【BZOJ 4710】 4710: [Jsoi2011]分特产 (容斥原理)
- BZOJ 4710: [Jsoi2011]分特产 [容斥原理]
- 【bzoj4710】[Jsoi2011]分特产 容斥原理+组合数学
- [BZOJ4710][JSOI2011]分特产(组合数+容斥原理)
- bzoj 4710: [Jsoi2011]分特产 (容斥原理+DP)
- Bzoj4710 [Jsoi2011]分特产
- [BZOJ4710][JSOI2011]分特产(组合数学+容斥原理)
- [BZOJ4710]4710: [Jsoi2011]分特产 容斥原理+组合数学
- [容斥][排列组合] BZOJ4710 && Jsoi2011.分特产
- 【JSOI2011】bzoj4710 分特产
- [Jsoi 2011] bzoj4710 分特产 [容斥原理+组合数学]
- bzoj 4710 : [Jsoi2011]分特产