CF451E
一道不错的题,对排列组合能力的要求较高
题意:给定s个相同的小球放在n个不同的盒子里,可以不放,每个盒子有一个放的上限,求一共有多少种放法
解析:首先考虑没有上限的情况,这里比较好解决,采用隔板法,可以计算出放法为
看到网上很少有对这个隔板法进行详解的,这里稍微做一下解释:
隔板法,顾名思义,就是采用放置隔板的方法来进行分组方式的计算,在这里,由于每个小球都是相同的,所以唯一产生不同的可能性就是不同盒子里放的小球个数不同,那么这就转化为了一个分组问题:将s个小球用n-1个隔板分为n组,问方案数有多少
但有一个问题,就是盒子可以不放,如果单纯用隔板的话对于不放的盒子是处理不了的
所以我们再引入n个小球,要求每个盒子至少放一个,这样就能解决这个问题了
所以答案是
接下来,由于现在有上限,所以直接用这个答案是显然不对的。
于是我们考虑容斥。
那么显然,容斥方法就是至少有0个超过上限-至少有1个超过上限+至少有2个超过上限...
那么我们以至少有一个超过上限的算法举例:
显然,我们首先要枚举谁超过了上限,那么这一步可以使用状压来实现,将超过上限的点的状态记作1,其余点状态记作0即可,这样的思想也可以解决更多超过上限的情况。
接下来,我们考虑:至少一个超过上限的表现就是这一个盒子至少放了上限+1个球,而其余盒子随意,不做要求,故我们可以理解为首先将上限+1个球确定地放在这一个盒子里,然后把剩下的球随便放
那么剩下的球随便放的方法同样满足公式
(当然,球的总数会发生改变)
这样问题就解决了。
(其实推导之后有一个总的排列组合公式可以解决这个问题,但基本上看到这个公式正常人就跑了,所以这里只提出思想,因为事实上在实现的时候还是基于这个思想而不是基于最后的结论公式的)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define mode 1000000007
#define ll long long
using namespace std;
ll pow_mul(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
{
ans*=x;
ans%=mode;
}
x*=x;
x%=mode;
y>>=1;
}
return ans;
}
ll n;
ll f[25];
ll s;
int main()
{
scanf("%lld%lld",&n,&s);
for(int i=1;i<=n;i++)
{
scanf("%lld",&f[i]);
}
ll ret=0;
for(int i=0;i<(1<<n);i++)
{
int flag=1;
ll tot=s;
for(int j=0;j<n;j++)
{
if(i&(1<<j))
{
flag=-flag;
tot-=(f[j+1]+1);
}
}
if(tot<0)
{
continue;
}
ll s1=1,s2=1;
for(int j=1;j<=n-1;j++)
{
s1*=(tot+j)%mode;
s1%=mode;
s2*=j;
s2%=mode;
}
s1*=pow_mul(s2,mode-2);
ret+=flag*s1;
ret=((ret%mode)+mode)%mode;
}
printf("%lld\n",ret);
return 0;
}
CF451E的更多相关文章
- CF451E Devu and Flowers 解题报告
CF451E Devu and Flowers 题意: \(Devu\)有\(N\)个盒子,第\(i\)个盒子中有\(c_i\)枝花.同一个盒子内的花颜色相同,不同盒子的花颜色不同.\(Devu\)要 ...
- CF451E Devu and Flowers(容斥)
CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...
- CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)
Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...
- CF451E Devu and Flowers
多重集求组合数,注意到\(n = 20\)所以可以用\(2 ^ n * n\)的容斥来写. 如果没有限制那么答案就是\(C(n + s - 1, n - 1)\).对每一个限制依次考虑,加上有一种选多 ...
- Luogu CF451E Devu and Flowers 题解报告
题目传送门 [题目大意] 有n种颜色的花,第i种颜色的花有a[i]朵,从这些花中选m朵出来,问有多少种方案?答案对109+7取模 [思路分析] 这是一个多重集的组合数问题,答案就是:$$C_{n+m- ...
- CF451E Devu and Flowers 数论
正解:容斥+Lucas定理+组合数学 解题报告: 传送门! 先mk个我不会的母函数的做法,,, 首先这个题的母函数是不难想到的,,,就$\left ( 1+x_{1}^{1}+x_{1}^{2}+. ...
- CF451E Devu and Flowers(组合数)
题目描述 Devu想用花去装饰他的花园,他已经购买了n个箱子,第i个箱子有fi朵花,在同一个的箱子里的所有花是同种颜色的(所以它们没有任何其他特征).另外,不存在两个箱子中的花是相同颜色的. 现在De ...
- CF451E Devu and Flowers (组合数学+容斥)
题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入门题目 把取花 ...
- BZOJ1101 [POI2007]Zap 和 CF451E Devu and Flowers
Zap FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到 ...
随机推荐
- shell编程 之 流程控制(条件语句和循环语句)
1 if ...else... 基本格式: if condition then commend else commend fi 当然也可以写到一行,用[ ]表明边界,用:表示分行.比如: if [ $ ...
- Listary的使用
前几天研究米老师语录之后,开始对工具的使用着迷.现在的慢是为了以后的快,所以现在研究的一些东西,是为了以后在工作中可以更加快速的提高效率. 最近找到了一款很不错的软件,Listary.想给小伙伴们介绍 ...
- 【转】HTTP
[转]HTTP 一.http概述 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTT ...
- 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?
被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在E ...
- 转-4年!我对OpenStack运维架构的总结
4年!我对OpenStack运维架构的总结 原创: 徐超 云技术之家 今天 前言 应“云技术社区”北极熊之邀,写点东西.思来想去云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深 ...
- Linux基础知识之bashrc和profile的用途和区别
使用终端ssh登录Linux操作系统的控制台后,会出现一个提示符号(例如:#或~),在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的Shell来做处理. ...
- $Django 在线文本编辑器skindeditor
简介 KindEditor是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富 ...
- web@HTML常用标签分类,标签嵌套规则
一.html标签又叫做html元素,它分为块级元素和内联元素(也可以叫做行内元素),都是html规范中的概念.1.块级元素块级元素是指本身属性为display:block;的元素.因为它自身的特点,我 ...
- java子类数组的引用转换成超类数组的引用
public class Person { } public class Student extends Person{ private String name; public Student(Str ...
- 查看当前APP打开的是哪个Activity
按下 “window键+R键” 打开电脑的 “运行” 窗口,输入“cmd”,进入你的adb.exe所在的目录,输入 “ adb shell "dumpsys window | grep mC ...