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

对于 \(\{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. 机器学习(一)之KNN算法

    knn算法原理 ①.计算机将计算所有的点和该点的距离 ②.选出最近的k个点 ③.比较在选择的几个点中那个类的个数多就将该点分到那个类中 KNN算法的特点: knn算法的优点:精度高,对异常值不敏感,无 ...

  2. nginx基本安全优化

    一.调整参数隐藏nginx软件版本号信息 查看nginx版本信息: [root@nginx conf]# curl -I 192.168.200.102 HTTP/1.1 200 OK Server: ...

  3. python3爬取豆瓣top250电影

    需求:爬取豆瓣电影top250的排名.电影名称.评分.评论人数和一句话影评 环境:python3.6.5 准备工作: 豆瓣电影top250(第1页)网址:https://movie.douban.co ...

  4. hdu-1231 连续最大子序列(动态规划)

    Time limit1000 ms Memory limit32768 kB 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj ...

  5. city Engine 建模

    基本操作介绍 界面布局,文件组织 五个常见图层 常见规则,替换思想

  6. 做ios工程时,把UI从xib移动到代码中遇到的问题

    由于四期要做多语言版本,带xib页面的工程做多语言版本比较麻烦,再加上现在已经习惯了代码中的viewdidload函数中初始化控件,所以就把两个页面从xib移到代码中去了. 在修改后加载页面会遇到ba ...

  7. 线段树: CDOJ1598-加帕里公园的friends(区间合并,单点更新)

    加帕里公园的friends Time Limit: 3000/1000MS (Java/Others) Memory Limit: 131072/131072KB (Java/Others) 我还有很 ...

  8. Linux: 正则表达式

    正则表达式:正规的表示法,常规的表示法(Regular Expression)正则表达式使用单个字符串来描述,匹配一系列的符合某个句发规则的字符串. 1)命令格式; grep  [正则] 字符串 文件 ...

  9. win7 命令提示符怎么以管理员方式打开

    点击屏幕最左下角的"开始"按钮,选择"运行"命令: 在弹出的"运行"对话框中输入"CMD"命令,再单击"确定& ...

  10. webdriver高级应用- 高亮显示正在操作的页面元素

    #encoding=utf-8 import unittest from selenium import webdriver import time def highLightElement(driv ...