BZOJ 4710】的更多相关文章

4710: [Jsoi2011]分特产 题意:m种物品分给n个同学,每个同学至少有一个物品,求方案数 对于每种物品是独立的,就是分成n组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少一个=所有方案数-\ge 1个同学没有+\ge 2 个同学没有-... \] \(\ge i\)个同学没有,我们拿出来i个同学\(\binom{n}{i}\)个方案,剩下就是每种物品分成\(n-i\)组再乘起来罢了... #include <iostream> #include <cstdi…
题链: 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 个间…
4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 99  Solved: 65 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任 何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和…
4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同.将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方案数. 先考虑两个简单的问题 给定\(m\)个相同元素和\(n\)个不同位置,每个位置至少分一个的方案数? 使用插板法,等价于在\(m-1\)个空挡里插\(n-1\)个元素,方案数为 \[\binom{m-1}{n-1}\] 但是这样考虑,这个题目是做不了的. 给定\(m\)个相同元素和\(n\)个…
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任 何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的 分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻花 A:麻花.包子,B:麻花 解题报告: 用…
枚举几个同学分到了 对于每种特产求一个方案数(经典做法)乘起来 然后容斥 #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i) #define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i) #define per(i,a,b) for(int i=(b),i##_st=…
题目 容斥加组合计数 显然答案是 \[\sum_{i=0}^n(-1)^i\binom{n}{i}f_{n-i}\] \(f_i\)表示至多有\(i\)个人没有拿到特产 考虑求\(f\) 发现\(m\)种特产每一种是独立的,于是可以考虑对每一种特产分别计算 现在的问题转化成了把\(a_i\)个物品分给\(i\)个人,允许有人没有分到 显然组合数插板 \[f_j=\prod_{i=1}^m\binom{a_i+j-1}{j-1}\] 代码 #include<algorithm> #include…
有 $n$ 个人,$m$ 种物品,每种物品有 $a_i$ 个,求每个人至少分到一个的方案数 $n,m,a_i \leq 2000$ sol: 比上一个题简单一点 还是考虑容斥 每个人至少分到一个 = 随便选 - 至少 1 个人没分到 + 至少 2 个人没分到 - 至少 3 个人没分到 + ... 至少 $i$ 个人没分到就是选出 $i$ 个人分不到,然后对于每种物品,要把它分给剩下的 $(n-i)$ 个人,注意到物品间是相同的,人是不同的,插板就可以了 最后答案是 $\sum\limits_{i…
//By SiriusRen #include <cstdio> using namespace std; int n,m,a[1005]; typedef long long ll; ll C[2005][2005],f[2005][2005],g[2005],mod=1000000007ll; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d",&am…
传送门 解题思路 首先所有物品是一定要用完的,那么可以按照物品考虑,就是把每种物品分给\(n\)个人,每个人分得非负整数,可以用隔板法计算.设物品有\(m\)个,方案数为\(C(n+m-1,n-1)\).但这样会有人一个也分不到的情况,就容斥一下. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using n…