CF451E Devu and Flowers (组合数学+容斥)
题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$
容斥入门题目
把取花想象成往箱子里放花,不能超过箱子上限
$n$很小,考虑状压
如果去掉$a_{i}$的限制,我们取物品的方案数是$C_{s+n-1}^{n-1}$,可以想象成$s+n-1$个小球,我们取出$n-1$个隔板,分隔出来的其他$n$个部分就是每个箱子里花的数量
但这样会算入不合法的方案,我们需要再去掉不合法的方案
假设我们要满足i合法,那么首先分配给$i$,$ai+1$朵花,来保证它是不合法的
然后,剩余$s+n-(ai+1)-1$朵花,我们仍然要分配给$n$个箱子,取出$n-1$个隔板,总方案数减去$C_{s+n-(ai+1)-1}^{n-1}$
然而我们由算入了一些情况,即$i$不合法,$j$也不合法$(j!=i)$,在计算$i$和计算$j$时都去掉了这种情况,我们还要把它加回来
总方案再加回来$C_{s+n-(ai+aj+2)-1}^{n-1}$
然后又多减掉了$i,j,k$都不合法....依次容斥即可
公式太长,也不好理解就不列了
这道题的组合数很大,不能直接求,我们需要一些优化
因为$n$很小,但$s$很大,所以上下化简掉阶乘里那一段特别长的部分,剩下的$O(n)$暴力计算就行了
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 150
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define mod 1000000007
using namespace std;
//re
/*int gint()
{
int ret=0,fh=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}
while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
return ret*fh;
}*/
int n;
ll sum,ma;
ll a[N],mu[N],inv[N],minv[N];
ll qpow(ll x,ll y){
ll ans=;
if(y){
if(y&) ans=ans*x%mod;
x=x*x%mod,y>>=;
}return ans;
}
void Pre(){
minv[]=minv[]=inv[]=inv[]=;
for(int i=;i<=n;i++)
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod,minv[i]=minv[i-]*inv[i]%mod;
}
ll C(ll a,ll b)
{
ll ans=;
if(b>a) return ;
if(b==) return ;
for(ll j=a-b+;j<=a;j++)
ans=j%mod*ans%mod;
ans=ans*minv[b]%mod;
return ans;
}
ll Lucas(ll a,ll b)
{
if(b>a) return ;
if(a<mod&&b<mod) return C(a,b);
else return Lucas(a%mod,b%mod)*Lucas(a/mod,b/mod)%mod;
} int main()
{
//freopen("t1.in","r",stdin);
scanf("%d%I64d",&n,&ma);
int tot=(<<n)-;
for(int i=;i<n;i++)
scanf("%I64d",&a[i]);
ll ans=;
Pre();
for(int s=;s<=tot;s++)
{
ll res=ma;int cnt=;
for(int i=;i<n;i++)
if(s&(<<i)) res-=a[i]+,cnt++;
if(res<) continue;
(ans+=1ll*(cnt&?-:)*Lucas(res+n-,n-)%mod+mod)%=mod;
}
printf("%I64d\n",ans);
return ;
}
CF451E Devu and Flowers (组合数学+容斥)的更多相关文章
- CF451E Devu and Flowers(容斥)
CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...
- CF451E Devu and Flowers 解题报告
CF451E Devu and Flowers 题意: \(Devu\)有\(N\)个盒子,第\(i\)个盒子中有\(c_i\)枝花.同一个盒子内的花颜色相同,不同盒子的花颜色不同.\(Devu\)要 ...
- Codeforces 439E Devu and Birthday Celebration 容斥
Devu and Birthday Celebration 我们发现不合法的整除因子在 m 的因子里面, 然后枚举m的因子暴力容斥, 或者用莫比乌斯系数容斥. #include<bits/std ...
- CF451E Devu and Flowers 数论
正解:容斥+Lucas定理+组合数学 解题报告: 传送门! 先mk个我不会的母函数的做法,,, 首先这个题的母函数是不难想到的,,,就$\left ( 1+x_{1}^{1}+x_{1}^{2}+. ...
- HDU 6397 Character Encoding (组合数学 + 容斥)
题意: 析:首先很容易可以看出来使用FFT是能够做的,但是时间上一定会TLE的,可以使用公式化简,最后能够化简到最简单的模式. 其实考虑使用组合数学,如果这个 xi 没有限制,那么就是求 x1 + x ...
- [CSP-S模拟测试]:多维网格(组合数学+容斥)
题目传送门(内部题138) 输入格式 输入数据第一行为两个整数$d,n$. 第二行$d$个非负整数$a_1,a_2,...,a_d$. 接下来$n$行,每行$d$个整数,表示一个坏点的坐标.数 ...
- [BZOJ2839]:集合计数(组合数学+容斥)
题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...
- AcWing 214. Devu和鲜花 (容斥)打卡
Devu有N个盒子,第i个盒子中有AiAi枝花. 同一个盒子内的花颜色相同,不同盒子内的花颜色不同. Devu要从这些盒子中选出M枝花组成一束,求共有多少种方案. 若两束花每种颜色的花的数量都相同,则 ...
- CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)
Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...
随机推荐
- ajax第一天总结
AJAX开发步骤 步一:创建AJAX异步对象,例如:createAJAX() 步二:准备发送异步请求,例如:ajax.open(method,url) 步三:如果是POST请求的话,一定要设置AJAX ...
- ansible 工作原理以及使用详解
内容:1.ansible的作用以及工作结构2.ansible的安装以及使用3.ansible的playbook使用 一.ansible的作用以及工作结构 1.ansible简介: ...
- python生成器,递归调用
生成器 什么是生成器:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器 生成器就是迭代器 yield的功能 yield为我们提供了一种自定义迭代器 ...
- Ajax得到JSON数据
Ajax得到JSON数据
- Tomcat样例安全漏洞
[漏洞描述] Tomcat在使用的时候一般都直接官网下载源代码包直接使用. 默认情况下,Tomcat源码包里面包含了 examples 这个目录,这个目录主要实现一些样例页面的访问. 比如: ...
- 【 【henuacm2016级暑期训练】动态规划专题 P】Animals
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第i只动物如果饲养它的话. 代价是固定的就是(n-i+1)a[i] 所以相当于给你n个物品,每个物品的重量为(n-i+1)a[i], ...
- tring.Format格式化用法
(数字保留两位小数,且每隔3为用逗号隔开): string.format("1f,.2d",333) -->333.00 string.format("1f,.2d ...
- 在CentOS6.5下配置安装LVS
先上一个图,在内网测试机上安装了一个虚拟机,已经安装好了CentOS 乖乖连wget都没有安装,先安装wget吧 sudo yum install wget
- HDU 2865
和上题一样,但K较大,不能直接用矩阵来写.这个矩阵必定是这个形式的. 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 分成对角线上元素B与非对角线上元素A k: 1 2 3 4 ... ...
- Servlet体验之旅(二)——Session、Cookie
我们知道Session和Cookie都是用于会话跟踪的,仅仅是实现的方式不大一样,那么他们到底有什么不同呢?以下跟着我脚步来了解一下: Session.Cookie的含义: Session 一种ser ...