Bzoj4710--Jsoi2011分特产

组合计数+容斥原理的题目

考虑对于每一类特产分给所有人有多少种方式,就是把每类特产分给所有人的方案数乘积

把x个物品分给n个人的方案数可以看成n-1个分隔符和x个物品的排列数,即为n-1+x个物品中选出x个物品的方案数,即C(x,x+n-1)

但是这样会把不合法的状态也算入答案,所以可以容斥一波

n个人中有a个人没分到东西的方案数即为把x个物品分给n-a个人的方案数,最后再乘上n个人中选a个人的方案数即可

代码:

#include<bits/stdc++.h>
#define INF 1000000000
#define LNF 100000000000000ll
#define eps 1e-9
#define LL long long
#define MOD 1000000007
inline int _max(int a,int b) {return a>b?a:b;}
inline double _fabs(double a) {return a>0?a:-a;}

using namespace std;
#define MAXN 1005
#define MAXM 30005

LL C[MAXN*2][MAXN*2],ans;
int n,m,a[MAXN],mx;

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);
    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);
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-11-06 07:33:11

Bzoj4710--Jsoi2011分特产的相关文章

bzoj4710 [Jsoi2011]分特产(容斥)

4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 814  Solved: 527[Submit][Status][Discuss] Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任 何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产.

Bzoj4710 [Jsoi2011]分特产

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 96  Solved: 62[Submit][Status][Discuss] Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任 何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,

【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

[BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻

●BZOJ 4710 [Jsoi2011]分特产

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4710 题解: 容斥,组合先看看这个方案数的计算:把 M 个相同的东西分给 N 个人,每个人可以一个都分不到即把 M 个小球放入 N 个盒子,盒子可以为空. 方案数为 ${C}_{N+M-1}^{N-1}$.怎么理解如下: 如果现在有 N+m-1 个位置,我们可以在 N-1 个位置放隔板,并且令相邻的两个隔板(把首尾也看作另外2个隔板)中间的空余位置放小球.(相邻的两个隔板之间共有 N 个间

【BZOJ4710】分特产(容斥原理,组合计数)

题意:有m种特产,第i种有a[i]个 有n个同学分特产,要求: 1.恰好分完 2.每个人至少要分到一个 求方案数模10^9+7 n,m,a[i]<=1000 思路:WYZ作业 首先考虑对于每一种特产,a[i]个特产分给n个人而且每人都分到的方案数是C(n+a[i]-1,n-1)*c(n,n) 对于m种特产,所有人分的方案数就是它们的乘积 考虑有些人没分到,设现在只有n-i个人分到,另外i人什么都没有 方案数是c(n-i+a[i]-1,n-1-1)*c(n,n-i) 显然容斥,枚举有几人取到,对于

[Jsoi2011]分特产

Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任 何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的 分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻花 A:麻花.包子,B:麻花 Input 输

bzoj 4710 : [Jsoi2011]分特产

好久没做组合的题竟然懵逼了好长时间,去吃了顿饭就突然会做了... 如果没有每个人至少一个的限制的话那么答案显然是∏(c(n-1,a[i]+n-1)),相当于把每一种物品排成一排然后每排放(n-1)个隔板,第i个隔板和第i+1个隔板之间的物品就是第i个人的物品,显然每种方案对应着一种实际方案(会组合的人就当我是在废话吧). 那么如果加上限制呢,第一反应显然是容斥,上一段算出的答案可能有一个人没有,那就减去n-1个人的所有合法方案(没有空的人)*n(枚举谁没有),如果有两个人没有那就减去n-2个人的

luogu 5505 [JSOI2011]分特产 广义容斥

code: #include <bits/stdc++.h> #define N 10005 #define LL long long using namespace std; const LL mod=1000000007; void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str(),"r",stdin); } int a[N];

【题解】分特产(组合数+容斥)

[题解]分特产(组合数+容斥) 一道小水题. 假如没有这个要求每个人都要有一个特产的限制我们直接可以组合数. 我们又发现人(本质上)是没有区别的,所以容斥的复杂度只有\(O(n)\) \(n\)个人分\(m\)个特产,每个特产有\(a_i\)个,人可以不拿特产,的方案数就是把\(a_i\)分成\(n\)份,而且可以分为\(0\)份. 这个的答案就是 \[ f(n)=\prod_{i=1}^m {a_i+n-1\choose n-1} \] 意思就是有\(a_i+n\)个球分成不为空\(n\)份的