题目链接:

http://codeforces.com/problemset/problem/451/E

E. Devu and Flowers

time limit per test4 seconds
memory limit per test256 megabytes
#### 问题描述
> Devu wants to decorate his garden with flowers. He has purchased n boxes, where the i-th box contains fi flowers. All flowers in a single box are of the same color (hence they are indistinguishable). Also, no two boxes have flowers of the same color.
>
> Now Devu wants to select exactly s flowers from the boxes to decorate his garden. Devu would like to know, in how many different ways can he select the flowers from each box? Since this number may be very large, he asks you to find the number modulo (109 + 7).
>
> Devu considers two ways different if there is at least one box from which different number of flowers are selected in these two ways.

输入

The first line of input contains two space-separated integers n and s (1 ≤ n ≤ 20, 0 ≤ s ≤ 1014).

The second line contains n space-separated integers f1, f2, ... fn (0 ≤ fi ≤ 1012).

输出

Output a single integer — the number of ways in which Devu can select the flowers modulo (109 + 7).

样例输入

3 5

1 3 2

样例输出

3

题意

给你n个花瓶,每个花瓶上装有f[i]朵颜色相同的玫瑰。现在你要从中取s朵,问有多少种取法。

题解

首先,如果每个花瓶里面的花都有无限朵的话,那么这就是简单的隔板问题(c[s+n-1][n-1]),那么我们可以通过容斥把问题都转换成无限制的问题。 首先我们考虑第i个超过了限制,那么相当于对剩下的sum=s-f[i]-1,做一遍无限制的隔板,这样我们对n个花瓶容斥一遍,就能求出答案。

代码

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int mod=1e9+7; LL n;
LL s,f[22]; void gcd(LL a,LL b,LL& d,LL& x,LL& y){
if(!b){ d=a; x=1; y=0; }
else{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
} LL Inv(LL a,LL n){
LL d,x,y;
gcd(a,n,d,x,y);
return d==1?(x+n)%n:-1;
} LL get_C(LL n,LL m){
LL a=1,b=1;
for(int i=1;i<=m;i++){
b=b*i%mod;
a=a*(n-i+1)%mod;
}
return a*Inv(b,mod)%mod;
} LL Lucas(LL n,LL m){
if(m==0) return 1;
return get_C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
} int main() {
scf("%I64d%I64d",&n,&s);
for(int i=0;i<n;i++) scf("%I64d",f+i);
LL ans=0;
for(int i=0;i<(1<<n);i++){
LL sum=s;
int cnt=0;
for(int j=0;j<n;j++){
if((i&(1<<j))==0) continue;
cnt++;
sum-=(f[j]+1);
}
if(sum>=0){
if(cnt&1){
ans-=Lucas(sum+n-1,n-1);
}else{
ans+=Lucas(sum+n-1,n-1);
}
ans=(ans%mod+mod)%mod;
}
}
prf("%I64d\n",ans);
return 0;
} /*
5 3
1 2 9
3 4 5
3 5 3
*/

Codeforces Round #258 (Div. 2) 容斥+Lucas的更多相关文章

  1. Codeforces Round #258 (Div. 2)[ABCD]

    Codeforces Round #258 (Div. 2)[ABCD] ACM 题目地址:Codeforces Round #258 (Div. 2) A - Game With Sticks 题意 ...

  2. Codeforces Round #258 (Div. 2) 小结

    A. Game With Sticks (451A) 水题一道,事实上无论你选取哪一个交叉点,结果都是行数列数都减一,那如今就是谁先减到行.列有一个为0,那么谁就赢了.因为Akshat先选,因此假设行 ...

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

  4. Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

    http://blog.csdn.net/rowanhaoa/article/details/38116713 A:Game With Sticks 水题.. . 每次操作,都会拿走一个横行,一个竖行 ...

  5. Codeforces Round #258 (Div. 2)

    A - Game With Sticks 题目的意思: n个水平条,m个竖直条,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉 解题思路: 每次删除 ...

  6. Codeforces Round #258 (Div. 2) B. Sort the Array

    题目链接:http://codeforces.com/contest/451/problem/B 思路:首先找下降段的个数,假设下降段是大于等于2的,那么就直接输出no,假设下降段的个数为1,那么就把 ...

  7. Codeforces Round #258 (Div. 2) D. Count Good Substrings 水题

    D. Count Good Substrings 题目连接: http://codeforces.com/contest/451/problem/D Description We call a str ...

  8. Codeforces Round #258 (Div. 2) C. Predict Outcome of the Game 水题

    C. Predict Outcome of the Game 题目连接: http://codeforces.com/contest/451/problem/C Description There a ...

  9. Codeforces Round #258 (Div. 2) . Sort the Array 贪心

    B. Sort the Array 题目连接: http://codeforces.com/contest/451/problem/B Description Being a programmer, ...

随机推荐

  1. 笔记2:MYSQL 表操作

    一.表约束 1.非空约束:not null 作用:定义表的某一列不能为空. >> alter table 表名 modify 列名 int not null; "添加非空约束&q ...

  2. 关于<button> 没写 type='button' 导致点击时提交以及<button>和<input type="button">的区别

    这是我的第一篇博客,如果写的不好,请见谅 这是一个关于button按钮一个小问题 最近刚开学跟着老师一起写代码,在模仿JAVA web程序设计(慕课版) P61页第三章 Ajax处理XML的代码中发现 ...

  3. 【安装Ecshop2.7.2网站(LAMP环境)】--实践

    LAMP : Linux + Apache + Mysql + PHPEcshop2.7.2 注意:在输入命令过程中,学会用tab键补全命令,不要对着照抄,很容易出错. 前置:A:先设置虚拟机中的CD ...

  4. 20155231 邵煜楠《网络对抗技术》实验一 PC平台逆向破解

    20155231 邵煜楠<网络对抗技术>实验一 PC平台逆向破解 实验内容 直接修改程序机器指令,改变程序执行流程: 通过构造输入参数,造成BOF攻击,改变程序执行流: 注入Shellco ...

  5. 一维码Code 128简介及其解码实现(zxing-cpp)

    一维码Code 128:1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大. Cod ...

  6. SSIS 处理错误的方法

    Package在执行过程中,不可避免地会发生错误,如果处理错误?简单粗暴的做法,是Package直接停止运行.对于一个成熟的ETL工具,这显然不是唯一的错误处理方法.如果在数据流中出现错误,那么数据流 ...

  7. MGR的debug版本

    debug版本的MGR 相较于 非 debug 版本,  applier性能差距有40倍之多.

  8. post提交方式

    post提交方式 为提交 url 路径后的name值 getParameter 是获取url后面的参数的.getattribute 是获取 自己setattribute的.

  9. Bitcoin区块链攻击方式

    目录 重放攻击-- 非人为攻击 其他攻击 重放攻击-- 非人为攻击 重放攻击 Replay Attach 攻击者重复发送相同的数据库包到目的主机,用以欺骗系统 用支付宝付款信息重复项商家索取商品 比特 ...

  10. 【10.13】Bug Bounty Write-up 总结

    今天惯例邮箱收到了Twitter的邮件提醒有新的post,这种邮件每天都能收到几封,正好看到一个Bug Bounty的write up,比较感兴趣,看起来也在我的理解范围之内,这里对这篇write u ...