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


思路

首先如果可以有人不拿到就很好做

那么就可以考虑容斥

用\(f_i\)表示有i个人分包裹并且每个人都拿到的方案数

然后简单容斥就可以了


#include<bits/stdc++.h>

using namespace std;

const int N = 2010;
const int Mod = 1e9 + 7; int n, m, a[N], f[N];
int fac[N], inv[N]; int add(int a, int b) {
return (a += b) >= Mod ? a - Mod : a;
} int sub(int a, int b) {
return (a -= b) < 0 ? a + Mod : a;
} int mul(int a, int b) {
return 1ll * a * b % Mod;
} int fast_pow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = mul(res, a);
b >>= 1;
a = mul(a, a);
}
return res;
} int C(int a, int b) {
return mul(fac[a], mul(inv[a - b], inv[b]));
} int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) scanf("%d", &a[i]); fac[0] = inv[0] = 1;
for (int i = 1; i < N; i++) fac[i] = mul(fac[i - 1], i);
inv[N - 1] = fast_pow(fac[N - 1], Mod - 2);
for (int i = N - 2; i >= 1; i--) inv[i] = mul(inv[i + 1], i + 1); f[1] = 1;
for (int i = 2; i <= n; i++) {
int cur = 1;
for (int j = 1; j <= m; j++) {
cur = mul(cur, C(i + a[j] - 1, i - 1));
}
for (int j = 1; j < i; j++) {
cur = sub(cur, mul(C(i, j), f[j]));
}
f[i] = cur;
}
printf("%d", f[n]);
return 0;
}

BZOJ4710: [Jsoi2011]分特产【组合数学+容斥】的更多相关文章

  1. bzoj4710: [Jsoi2011]分特产 组合+容斥

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 289  Solved: 198[Submit][Status] ...

  2. bzoj4710 [Jsoi2011]分特产(容斥)

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 814  Solved: 527[Submit][Status] ...

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

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

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

    [BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同 ...

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

    共有 $m$ 种物品,每个物品 $a[i]$ 个,分给 $n$ 个人,每个人至少要拿到一件,求方案数. 令 $f[i]$ 表示钦定 $i$ 个没分到特产,其余 $(n-i)$ 个人随便选的方案数,$g ...

  6. BZOJ4710: [Jsoi2011]分特产 组合数学 容斥原理

    题意:把M堆特产分给N个同学,要求每个同学至少分到一种特产,共有多少种分法? 把A个球分给B个人的分法种数:(插板法,假设A个球互不相同,依次插入,然后除以全排列去重) C(A,B+A) 把M堆特产分 ...

  7. [BZOJ4710][JSOI2011]分特产(组合数+容斥原理)

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 262[Submit][Status] ...

  8. BZOJ4710 [Jsoi2011]分特产 容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4710 题解 本来想去找一个二项式反演的题的,结果被 https://www.cnblogs.c ...

  9. BZOJ4710 JSOI2011分特产(容斥原理+组合数学)

    显然可以容斥去掉每人都不为空的限制.每种物品分配方式独立,各自算一个可重组合乘起来即可. #include<iostream> #include<cstdio> #includ ...

随机推荐

  1. Java 8 Lambda实现原理分析

    PDF文档已上传Github  Github:https://github.com/zwjlpeng/Angrily_Learn_Java_8 为了支持函数式编程,Java 8引入了Lambda表达式 ...

  2. 关于C#中的日期的一个简单总结

    首先,总结两个简单的方法,实现 秒 与 日期 的相互转换: public class MyTest { /// <summary> /// 将Unix时间戳转换为DateTime类型时间, ...

  3. sublime插件安装及常用插件配置

    1.下载 :百度云 工具中 2.注册 sgbteam Single User License EA7E-1153259 8891CBB9 F1513E4F 1A3405C1 A865D53F 115F ...

  4. codeforces 547c// Mike and Foam// Codeforces Round #305(Div. 1)

    题意:给出数组arr和一个空数组dst.从arr中取出一个元素到dst为一次操作.问每次操作后dst数组中gcd等于1的组合数.由于数据都小于10^6,先将10^6以下的数分解质因数.具体来说从2开始 ...

  5. CF1082G Petya and Graph

    题意 定义图权 = 图中边权总和 - 图中点权总和(空图的图权=0),求 n 个点 m 条边的无向图最大权子图. 把边看成点,这个点与两个原图中的点连边.直接最小割求最大闭合子图即可.

  6. 01-trie练习

    这里用递归实现01-trie, 可以看做是区间长度为2的幂的权值线段树, 能实现权值的所有操作, 异或时, 翻转左右儿子即可. 练习1 CF 817E Choosing The Commander 大 ...

  7. 『科学计算_理论』SVD奇异值分解

    转载请声明出处 SVD奇异值分解概述 SVD不仅是一个数学问题,在工程应用中的很多地方都有它的身影,比如前面讲的PCA,掌握了SVD原理后再去看PCA那是相当简单的,在推荐系统方面,SVD更是名声大噪 ...

  8. Linux文件与目录管理(二)

    一.处理目录的常用命令 ls:列出目录 cd:切换目录 pwd:显示当前的目录 mkdir:创建一个新的目录 rmdir:删除一个空的目录 cp:复制文件或者目录 rm:移除文件或者目录 可以使用ma ...

  9. SSM框架整合(实现从数据库到页面展示)

    SSM框架整合(实现从数据库到页面展示) 首先创建一个spring-web项目,然后需要配置环境dtd文件的引入,环境配置,jar包引入. 首先让我来看一下ssm的基本项目配件.(代码实现) 1.首先 ...

  10. OC 类的本质和分类

    一.分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件结构图: 在分类中添加一 ...