AcWing 214. Devu和鲜花 (容斥)打卡
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和鲜花 (容斥)打卡的更多相关文章
- CF451E Devu and Flowers(容斥)
CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...
- 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 ...
- AcWing 231. 天码 (容斥)打卡
题目:https://www.acwing.com/problem/content/233/ 题意:给你n个不同的数,让你选取一个四元组,gcd为1,让你求这样的四元组数量是多少 思路:我们单独直接去 ...
- CodeForces - 451E Devu and Flowers (容斥+卢卡斯)
题意:有N个盒子,每个盒子里有fi 朵花,求从这N个盒子中取s朵花的方案数.两种方法不同当且仅当两种方案里至少有一个盒子取出的花的数目不同. 分析:对 有k个盒子取出的数目超过了其中的花朵数,那么此时 ...
- Codeforces 439E Devu and Birthday Celebration 容斥
Devu and Birthday Celebration 我们发现不合法的整除因子在 m 的因子里面, 然后枚举m的因子暴力容斥, 或者用莫比乌斯系数容斥. #include<bits/std ...
- UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...
- 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 ...
- CF451E Devu and Flowers (组合数学+容斥)
题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入门题目 把取花 ...
- Codeforces Round #258 (Div. 2) 容斥+Lucas
题目链接: http://codeforces.com/problemset/problem/451/E E. Devu and Flowers time limit per test4 second ...
随机推荐
- rabbitmqadmin命令行管理工具-4
rabbitmqadmin命令行管理工具原文地址: https://www.cnblogs.com/wuzhiyuan/p/6856985.htmlhttps://www.cnblogs.com/mr ...
- 经典JS 判断上传文件大小和JS即时同步电脑时间
我也是新手,还是一个JS笨,有一些网站要实现的功能要自己写么? 答案是不会,去问同事大佬吧,闲简单.就在晚上看了一些其他大佬们写的JS效果, 代码很少.占用网站CPU也小的多.可以一用, 废话少扯.代 ...
- Linux配置Selenium+Chrome+Python
---恢复内容开始--- 最近一个月没有更新博客了.最近都在复习LINUX与PYTHON知识.决定以后在LINUX环境下学习新知识. 包括后期的框架学习与平台知识方面. 直接记录今天下午的学习成果. ...
- Git 提交的正确姿势
Git 提交的正确姿势:Commit message 编写指南 SCOP范围 middleware core config plugin test type范围 Git 每次提交代码,都要写 Comm ...
- Java学习之包
一.包:就是类的命名空间(在文件系统中的表现形式就是文件夹) 二.代码编写规则 1.写在程序文件的第一行 2.格式:package 包名[.包名1.包名2......] 类的全名称 包名.类名 例如: ...
- C#进阶系列——WebApi 路由机制剖析:你准备好了吗? 转载https://www.cnblogs.com/landeanfen/p/5501490.html
阅读目录 一.MVC和WebApi路由机制比较 1.MVC里面的路由 2.WebApi里面的路由 二.WebApi路由基础 1.默认路由 2.自定义路由 3.路由原理 三.WebApi路由过程 1.根 ...
- IDEA-Tomcat 运行报错
我的问题是SDK版本不一致
- Cocos2d之FlyBird开发---简介
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 开发FlyBird其实非常的简单,在游戏的核心部分,我们需要实现的只有: 创建一个物理世界(世界设置重力加速度) 在物理世界中添加一个动态 ...
- Ubuntu解压缩rar格式文件
解压缩rar文件时,出现问题 解决方法: sudo apt-get install unrar
- Debian 防火墙 打开 关闭
Debian原来用的是UFW防火墙,之前没接触过这种类型防火墙,懵逼了半天,这里记录一下简单的使用规则,后期在使用过程中慢慢完善UFW防火墙的使用操作方法: 查看防火墙现有规则: ufw status ...