可重集的排列数 + 容斥原理

对于 \(\{A_1 * C_1, A _2 * C_2, \cdots, A_n * C_n\}\)这样的集合来说,

设 \(N = \sum_{i = 1} ^ n A_i\), 要在这个集合中取出 \(M\) 个元素来,这样的方案数是:

\[C _ {N+M-1}^{N-1} - \sum _ {i =1} ^ n {C_{N+M-A_i - 2}^{N-1}} + \sum _ {1\leq i < j \leq n} ^ n {C_{N+M - A_i - A_j -3}^{N-1}} \cdots +(-1)^N * C_{N+M-\sum_{i = 1}^n {c_i} - (N+1)}^{N-1}
\]

我们可以通过枚举 \(1 \sim 2 ^ N - 1\)的数来表示这些组合数,对于一个数 \(x\) 来说,如果它的第 \(p\) 位上是 1 ,就表示减去 \(A_p\) ,若一共有 \(q\) 位是 1 ,则 一共减去 \(q\) 个元素,

在计算组合数 \(C_M^N\) 的时候,我们可以先计算 \(A_M^N\), 在乘上 \((N- 1)!\)的逆元.

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int MOD = 1000000007;
ll n, inv[100];
ll num[50], m, ans;
ll C(ll x, ll y) {
if(x < 0 || y < 0 || x < y) return 0;
x %= MOD;
if(!y) return 1;
if(!x) return 0;
ll ans = 1ll;
for(int i = 0; i < y; i++) {
(ans *= (x - i) ) %= MOD;
}
(ans *= inv[y] ) %= MOD;
return ans;
}
int main() {
inv[0] = inv[1] = 1;
for(int i = 2; i <= 30; i++) inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
for(int i = 2; i <= 30; i++) (inv[i] *= inv[i - 1]) %= MOD;
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> num[i];
ans += C(m + n - 1, n - 1);
for(int i = 1; i < (1 << n); i++) {
ll t = m + n;
int p = 0;
for(int j = 0; j < n; j++) {
if((i >> j) & 1) {
p++;
t -= num[j + 1];
}
}
t -= p + 1;
if(p & 1) {
(ans -= C(t, n - 1)) %= MOD;
}else (ans += C(t, n - 1)) %= MOD;
}
cout << (ans + MOD) % MOD << endl;
return 0;
}

CF 451E Devu and Flowers的更多相关文章

  1. Codeforces 451E Devu and Flowers(容斥原理)

    题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组 ...

  2. codeforces 451E Devu and Flowers

    题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为  s支花分到 ...

  3. Codeforces 451E Devu and Flowers(组合计数)

    题目地址 在WFU(不是大学简称)第二次比赛中做到了这道题.高中阶段参加过数竞的同学手算这样的题简直不能更轻松,只是套一个容斥原理公式就可以.而其实这个过程放到编程语言中来实现也没有那么的复杂,不过为 ...

  4. codeforces 451E. Devu and Flowers 容斥原理+lucas

    题目链接 给n个盒子, 每个盒子里面有f[i]个小球, 然后一共可以取sum个小球.问有多少种取法, 同一个盒子里的小球相同, 不同盒子的不同. 首先我们知道, n个盒子放sum个小球的方式一共有C( ...

  5. CodeForces - 451E Devu and Flowers (容斥+卢卡斯)

    题意:有N个盒子,每个盒子里有fi 朵花,求从这N个盒子中取s朵花的方案数.两种方法不同当且仅当两种方案里至少有一个盒子取出的花的数目不同. 分析:对 有k个盒子取出的数目超过了其中的花朵数,那么此时 ...

  6. Codeforces 451E Devu and Flowers【容斥原理+卢卡斯定理】

    题意:每个箱子里有\( f[i] \)种颜色相同的花,现在要取出\( s \)朵花,问一共有多少种颜色组合 首先枚举\( 2^n \)种不满足条件的情况,对于一个不被满足的盒子,我们至少拿出\( f[ ...

  7. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  8. E. Devu and Flowers

    E. Devu and Flowers time limit per test 4 seconds memory limit per test 256 megabytes input standard ...

  9. Codeforces Round #258 (Div. 2) E. Devu and Flowers 容斥

    E. Devu and Flowers 题目连接: http://codeforces.com/contest/451/problem/E Description Devu wants to deco ...

随机推荐

  1. DROP RULE - 删除一个重写规则

    SYNOPSIS DROP RULE name ON relation [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP RULE 删除一个规则. PARAMETE ...

  2. 什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字

    静态代码块?类加载就执行,最先执行 class demo{ static int num; static{ num=10; num*=3; System.out.println("haha& ...

  3. JS数据结构与算法--单向链表

    链表结构:链表中每个元素由一个存储元素本身的节点和一个指向下一元素的引用组成.如下所示(手画的,比较丑,懒得用工具画了,嘻嘻) 1.append方法,向链表末尾插入一个节点 2.insert(posi ...

  4. 洛谷 P2735 电网

    https://www.luogu.org/problemnew/show/P2735 定理什么的最讨厌了,匹克定理?不会,也不想学. 粉色的为电网,将图中的电网我们将他构造一个矩形,然后蓝色和绿色的 ...

  5. CPL学习笔记(二)

    数组 数组(array) 声明通用格式为: typeName arrayName[arraySize]. arrayName指定元素数目,必须为整型常量或const值.(不能是变量) int a[3] ...

  6. Unity基础-发布

    PC BuildSetting File->BuildSetting Switch Platform Development Build是在调试模式下使用版本 Script Debugging调 ...

  7. 【linux】服务说明

     引用自<鸟哥的linux私房菜>  http://cn.linux.vbird.org/linux_server/0210network-secure_3.php 服务名称 服务内容 a ...

  8. Python入门基础--字符编码与文件处理

    字符编码 文本编辑器存取文件的原理 #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失 #2.要想永久保存,需要点击保存按钮:编辑器把内 ...

  9. HDU 3861 The King’s Problem 强连通分量 最小路径覆盖

    先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...

  10. Linux权限和指令的关系

    1.让用户能进入某目录称为”可工作目录“的基本权限为何: 可使用的指令:例如cd等变换工作目录的指令: 目录所需权限:用户对这个目录至少需要具有x的权限 额外需求:如果用户想要在这个目录内利用ls查阅 ...