Description

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

Input

输入数据第一行是同学的数量N 和特产的数量M。
第二行包含M 个整数,表示每一种特产的数量。
N, M 不超过1000,每一种特产的数量不超过1000

Output

输出一行,不同分配方案的总数。由于输出结果可能非常巨大,你只需要输出最终结果MOD 1,000,000,007 的数值就可以了。

Sample Input

5 4
1 3 3 5

Sample Output

384835

题解

想到了隔板法,想到了容斥...就是不知道怎么写...

对于总共$n$个人,很容易想到第$i$个物品,分出的方案数为$C^{n-1} _{a[i]+n-1}$,其中$a[i]$为个数(隔板法)。

但是这样做就会导致有人分不到特产。

考虑容斥,我们-一个人分不到的情况+两个人分不到的情况-三个人...

我们直接限定隔板的数目来强制一些人分不到特产,即方案数变为$C^{n-1-i} _{a[j]+n-1-i}$,其中$i$个人强制分不到,第$j$个物品。

注意最后,因为分不到的人可以是任意的,所以每次容斥还要*$C^i _n$。

 1 //It is made by Awson on 2017.9.25
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <queue>
 7 #include <stack>
 8 #include <string>
 9 #include <cstdio>
10 #include <vector>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define Min(a, b) ((a) < (b) ? (a) : (b))
16 #define Max(a, b) ((a) > (b) ? (a) : (b))
17 #define LL long long
18 using namespace std;
19 const int N = 1000;
20 const int MOD = 1000000007;
21
22 int n, m, mx;
23 int a[N+5];
24 int C[N*2+5][N*2+5];
25
26 void work() {
27     scanf("%d%d", &n, &m);
28     for (int i = 1; i <= m; i++) {
29         scanf("%d", &a[i]);
30         mx = Max(mx, a[i]);
31     }
32     mx += n;
33     for (int i = 0; i <= mx; i++) {
34         C[i][0] = 1;
35         for (int j = 1; j <= i; j++)
36             C[i][j] = (C[i-1][j-1]+C[i-1][j])%MOD;
37     }
38     LL ans = 0;
39     for (int i = 0; i < n; i++) {
40         LL cnt = 1;
41         for (int j = 1; j <= m; j++)
42             cnt = cnt*C[a[j]+n-1-i][n-1-i]%MOD;
43         cnt = cnt*C[n][i]%MOD;
44         if (i%2) ans = (ans+MOD-cnt)%MOD;
45         else ans = (ans+cnt)%MOD;
46     }
47     printf("%lld\n", ans);
48 }
49 int main() {
50     work();
51     return 0;
52 }

转载于:https://www.cnblogs.com/NaVi-Awson/p/7594023.html

[JSOI 2011]分特产相关推荐

  1. BZOJ 4710 [Jsoi2011]分特产 解题报告

    4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同.将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方 ...

  2. 【BZOJ4710】[JSOI2011]分特产(容斥)

    [BZOJ4710]分特产(容斥) 题面 BZOJ 题解 比较简单吧... 设\(f[i]\)表示至多有\(i\)个人拿到东西的方案数. \(f[i]=\prod_{j=1}^m C_{m+i-1}^ ...

  3. JSOI2011 分特产题解

    [JSOI2011]分特产 题目描述 JYY 带队参加了若干场 ACM/ICPC\text{ACM/ICPC}ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特 ...

  4. BZOJ 4710: [Jsoi2011]分特产

    传送门 见计数想容斥 发现所有同学至少有一个特产的限制不好搞 考虑设 $F[i]$ 表示 至少 有 $i$ 个同学没有特产的方案数 那么根据容斥原理答案就是 $F[0]-F[1]+F[2]-F[3]. ...

  5. bzoj 4710 [Jsoi2011]分特产 组合数学+容斥原理

    题面 题目传送门 解法 考虑容斥原理 显然,我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有\(x\)个物品,\(n\)个人,可以有人没有被分到,那么分给这\(n\)个人的方案数 ...

  6. 语法入门*算法入门题单

    作者:王清楚 链接:https://ac.nowcoder.com/discuss/817596?type=101&order=0&pos=1&page=4&chann ...

  7. 【新手上路】语法入门算法入门题单

    作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...

  8. kinectfusion解析_2019/02/09 对于KinectFusion 的理解

    网上有很多关于Kinect Fusion 的详细介绍,包括各个部分的算法,思路,以及应用上的限制和优化. 在此就不多介绍了. KinectFusion 提供了非常基础的用RGB-D 相机实现的 Den ...

  9. win10 linux开发环境搭建,win10子系统linux.ubuntu开发环境搭建

    UI线程和work线程 UI线程处理消息,比如重绘,响应键盘鼠标等等跟消息有关的处理. 而工作线程一般是你自己写的用来处理数据的,比如操作数据库等等.(work线程) ORACLE 自定义分页存储过程 ...

最新文章

  1. linux systemd 服务管理脚本简介
  2. python打开一个文件夹下所有txt文件-python读取一个目录下所有txt里面的内容方法...
  3. 面试题37:两个链表的第一个公共结点
  4. Linux字符驱动程序的基本结构与函数
  5. SQL常用语句大全(值得收藏)
  6. 40种网站设计常用方法
  7. LS 24 Bracket sequence(DP)
  8. 使用 jQuery Mobile 与 HTML5 开发 Web App (八) —— jQuery Mobile 工具栏
  9. redis linux工具安装,linux 安装redis缓存工具
  10. __init__.py的作用是什么?
  11. 更改VMware虚拟机硬件版本
  12. 记一次python cpu100%分析记录
  13. 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与YIQ颜色空间转换
  14. 调焦后焦实现不同距离成像_照片要清晰、对焦必须深入理解!对焦模式、对焦区域模式等对焦知识...
  15. 第14节 三个败家子(14)——在辉煌中走向深渊
  16. Python绘制气泡图
  17. centos7 Zookeeper集群部署
  18. 【MySQL】浅谈MySQL中索引的基本操作以及背后的数据结构
  19. Java面试题---第四阶段
  20. 亚马逊ERP软件贴牌OEM是什么意思有什么优势

热门文章

  1. 编译错误 无法打开包括文件:“SDKDDKVer.h”: No such file or directory
  2. nafxcw.lib与LIBCMT.lib在vs2008中链接冲突解决方案
  3. 13个代码注释的小贴士
  4. POJ 2778 DNA Sequence (AC自动机+矩阵快速幂)
  5. 判断能被N整除的字符串
  6. ksnapshot运行look up error undefined symbol错误解决方案
  7. 记录 之 numpy查看数据类型和类型转换
  8. linux java 查询mysql_Linux Java连接MySQL数据库
  9. 双口RAM和多模块存储器
  10. 数理统计-5.2 样本数据的整理和显示