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 ...
随机推荐
- python_购物车程序
#需求1.启动程序后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4.可随时退出,退出时,打印已购买商品和余额 #先定义 ...
- 2019-03-15 使用Request POST获取中加基金的PDF文件,并下载到本地
import requests import time base_url='http://www.bobbns.com/common-web/cms/content!getContentsInclud ...
- android startservice无法启动服务
1.android startservice无法启动服务 之前MainActivity.java中启动service源代码如下: private void startMyService() { //启 ...
- POJ 2230 Watchcow
Watchcow Time Limit: 3000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 2 ...
- 一个通用Makefile的编写
作者:杨老师,华清远见嵌入式学院讲师. 我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文件.如果我们用gcc去一个一个编译每一个源文件的 ...
- mysql数据库连接工具类C3P0
package com.dl.network_flow.db; import java.sql.Connection; import java.sql.PreparedStatement; impor ...
- eclipse 设置代码大小和布局里面代码大小
Eclipse字体大小调整: Window / Preferences / General / Appearance / ColorsAnd Fonts .在右边的对话框里选择Java – Java ...
- bzoj3732: Network(最小生成树+LCA)
3732: Network 题目:传送门 题解: 第一眼就看到最大边最小,直接一波最小生成树. 一开始还担心会错,问了一波肉大佬,任意两点在最小生成树上的路径最大边一定是最小的. 那么事情就变得简单起 ...
- JS,Javascript加载与函数执行过程
Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ...
- WIN7使用VisualSVN建立SVN服务器
使用SVN开发十分的方便,这样就不用每次都拷贝粘贴来备份了,网上看到一篇给自己的windows电脑安装SVN服务器的使用非常方便. 1.下载安装文件(服务器端和客户端) 服务器端采用VisualSVN ...