Devu有N个盒子,第i个盒子中有AiAi枝花。

同一个盒子内的花颜色相同,不同盒子内的花颜色不同。

Devu要从这些盒子中选出M枝花组成一束,求共有多少种方案。

若两束花每种颜色的花的数量都相同,则认为这两束花是相同的方案。

结果需对109+7109+7取模之后方可输出。

输入格式

第一行包含两个整数N和M。

第二行包含N个空格隔开的整数,表示A1,A2,…,ANA1,A2,…,AN。

输出格式

输出一个整数,表示方案数量对109+7109+7取模后的结果。

数据范围

1≤N≤201≤N≤20,
0≤M≤10140≤M≤1014,
0≤Ai≤10120≤Ai≤1012

输入样例:

3 5
1 3 2

输出样例:

3

题意:让你在n朵花里面选择m朵,其中有些花朵相同,然后求方案数有多少种,不用顺序排列
思路:这里其实就是一个多重集的组合数问题 多重集的排列问题 有k个物品,总共有n个种类,第ni个种类有a[i]个物品,问全排列数是多少
就是 n!/(n1!*n2!*....ni!),道理很简单,全部不相同的全排列数是n!,但是这个其中有重复,所以我们需要去重,所有我们对每个种类求个全排列
然后除就行,其中每个种类的重复又可以和其他种类的重复产生联系,所以是乘法原理,把所有的种类全排列相乘即可
多重集的组合问题
有k个物品,总共有n个种类,第ni个种类有a[i]个物品,然后从中选择m个,问有多少个选择方法 多重集的组合数的弱化版(m=<a[i])
如果是基于这个条件的话,那么我们就可以直接采用隔板法来计算,首先我们选择m个商品,我们条件那么就只有在每个种类选择的个数加起来等于m即可
又因为我们的m不会大于每个种类个数,那么我们就把他分为n组即可,使用n-1个隔板,那么这个的答案就是
C(n+m-1,n-1) 我们把我们的m个商品分个类,分成n份,所有我们还加入了n-1个隔板,所以就是这个答案 多重集的组合数的强化版(m<=n)
首先这个不能和上面用一样的方法了,上面的我们限制了,m<=a[i],说明我们无论怎么对m进行分割,单个分组的个数不可能大于输入的组的个数,但是现在给定你的那个条件有可能出现
单个分组大于输入分组个数,这样的方案都是不可行的,在这里我们就需要使用容斥来去掉我们无法使用的方案,这里我们可以使用原来的方案去减掉有一个超过限制,两个,三个.....n个
然后这1,2,3,....n个中又有重复,所以我们需要使用容斥
Ck−1k−r−1−∑i=1kCk−1k+r−ni−2+∑1≤i≤j≤nCk−1k+r−ni−nj−3−...+(−1)kCk−1k+r−∑ki=1ni−(k+1)
写代码的时候我们枚举所有情况,我们使用状压,当前二进制1就代表容斥选择了这个项
#include<bits/stdc++.h>
#define maxn 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m;
ll a[];
ll inv[];
ll quick_pow(ll a,ll b)
{
ll ans=;
while(b){
if(b&) ans=(ans*a)%mod;
b=b/;
a=(a*a)%mod;
}
return ans;
}
ll C(ll n,ll m){
if(n<||m<||n<m) return ;
n%=mod;
if(n==||m==) return ;
ll ans=;
for(int i=;i<m;i++){
ans=(ans*(n-i))%mod;
}
for(int i=;i<=m;i++){
ans=(ans*inv[i])%mod;
}
return ans;
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++) inv[i]=quick_pow(i,mod-);//求出1-n的逆元,留着求组合数乘积的时候使用
ll ans=;
for(int i=;i<(<<n);i++){
if(i==){
ans=(ans+C(n+m-,n-))%mod;
}
else{
ll p=;
ll t=n+m;
for(int j=;j<n;j++){
if((i>>j)&){
p++;
t-=a[j+];
}
}
t-=p+;
if(p&){
ans=(ans-C(t,n-))%mod;
}
else{
ans=(ans+C(t,n-))%mod;
}
}
}
cout<<(ans+mod)%mod;
}

AcWing 214. Devu和鲜花 (容斥)打卡的更多相关文章

  1. CF451E Devu and Flowers(容斥)

    CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...

  2. 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 ...

  3. AcWing 231. 天码 (容斥)打卡

    题目:https://www.acwing.com/problem/content/233/ 题意:给你n个不同的数,让你选取一个四元组,gcd为1,让你求这样的四元组数量是多少 思路:我们单独直接去 ...

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

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

  5. Codeforces 439E Devu and Birthday Celebration 容斥

    Devu and Birthday Celebration 我们发现不合法的整除因子在 m 的因子里面, 然后枚举m的因子暴力容斥, 或者用莫比乌斯系数容斥. #include<bits/std ...

  6. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...

  7. CF(439E - Devu and Birthday Celebration)莫比乌斯容斥

    题意:将n个糖果插入f-1个挡板分成f分(a1,a2,a3...af). 问有多少种分法能够使得gcd(a1,a2,a3...af)=1; 解法.莫比乌斯容斥,首先按1为单位分,这时候有C(n-1,f ...

  8. CF451E Devu and Flowers (组合数学+容斥)

    题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入门题目 把取花 ...

  9. Codeforces Round #258 (Div. 2) 容斥+Lucas

    题目链接: http://codeforces.com/problemset/problem/451/E E. Devu and Flowers time limit per test4 second ...

随机推荐

  1. umeditor word文档图片粘贴-自动上传到服务器

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  2. Activity 启动模式总结

    Activity 启动模式: 1. standard: 默认启动模式,每次启动一个Activity都会重新创建一个实例: 2. singleTop: 栈顶复用模式,新Activity位于任务栈的栈顶, ...

  3. vue项目git

    https://github.com/renrenio/renren-fast-vue https://github.com/hzlshen/vue-project

  4. docker-swarm笔记

    1.部署环境: centos7 创建三节点的 swarm 集群 swarm-manager 是 manager node : 192.168.1.150 swarm-worker1 和 swarm-w ...

  5. Dealing with exceptions thrown in Application_Start()

    https://blog.richardszalay.com/2007/03/08/dealing-with-exceptions-thrown-in-application_start/ One a ...

  6. JS-for..of

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of 刚刚上网上看到<V8 ...

  7. python接口自动化测试三十六:数据驱动参数化之paramunittest

    官方文档1.官方文档地址:https://pypi.python.org/pypi/ParamUnittest/2.github源码下载地址:https://github.com/rik0/Param ...

  8. 九条命令检查Linux服务器性能

    一.uptime命令 这个命令可以快速查看机器的负载情况.在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量.这些数据可以让我们对系统资源使用有一个宏观 ...

  9. CommonJS规范 by ranyifeng

    1,概述 CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行,最后返回 ...

  10. 热修复设计之AOT/JIT&dexopt 与 dex2oat (一)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从AOT/JIT&dexopt 与 dex2o ...