Codeforces Round #258 (Div. 2) 容斥+Lucas

时间:2021-12-24 04:45:14

题目链接:

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

E. Devu and Flowers

time limit per test4 secondsmemory 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 &num;258 &lpar;Div&period; 2&rpar;&lbrack;ABCD&rsqb;

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

  2. Codeforces Round &num;258 &lpar;Div&period; 2&rpar; 小结

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

  3. Codeforces Round &num;258 &lpar;Div&period; 2&rpar; E&period; Devu and Flowers 容斥

    E. Devu and Flowers 题目连接: http://codeforces.com/contest/451/problem/E Description Devu wants to deco ...

  4. Codeforces Round &num;258 &lpar;Div&period; 2&rpar;-&lpar;A&comma;B&comma;C&comma;D&comma;E&rpar;

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

  5. Codeforces Round &num;258 &lpar;Div&period; 2&rpar;

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

  6. Codeforces Round &num;258 &lpar;Div&period; 2&rpar; B&period; Sort the Array

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

  7. Codeforces Round &num;258 &lpar;Div&period; 2&rpar; D&period; Count Good Substrings 水题

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

  8. Codeforces Round &num;258 &lpar;Div&period; 2&rpar; C&period; Predict Outcome of the Game 水题

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

  9. Codeforces Round &num;258 &lpar;Div&period; 2&rpar; &period; Sort the Array 贪心

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

随机推荐

  1. 报错&colon;org&period;eclipse&period;swt&period;SWTError&colon; No more handles &Tab;at org&period;eclipse&period;swt&period;SWT&period;error&lpar;SWT&period;java&colon;4517&rpar;

    在Mars.Kepler的版本裡,時常會出現以下錯誤導致eclipse無法進行運作 Error.log org.eclipse.swt.SWTError: No more handles     at ...

  2. SQL GROUP BY 后排序

    由于GROUP BY 使用Sum函数后 ID等唯一值就无法查询出来了,所以想按照ID排序也就不可以了. 这时可以使用一个MIN 或者MAX函数来取得一个最小或者最大的ID 这样就可以实现以其中一条ID ...

  3. Tcp服务端判断客户端是否断开连接

    今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链 ...

  4. List转换成DataSet实现代码

    public DataSet ConvertToDataSet<T>(IList<T> list) { if (list == null || list.Count <= ...

  5. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5&period;5&period;3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  6. MySQL server has gone away错误的解决办法

    在我们使用mysql导入大文件sql时可能会报MySQL server has gone away错误,该问题是max_allowed_packet配置的默认值设置太小,只需要相应调大该项的值之后再次 ...

  7. C&num;多线程图片爬虫

    写了个简单的多线程图片爬虫,整理一下.数据已经爬下来了,图片URL需要自行拼接,首先从Lawyers表中取的RawData字段,RawData中有一个list字段是json格式的数据,需要的只是lis ...

  8. ASP&period;NET Core - 关于Tag Helper值得了解的五点

    如果您开发过ASP.NET Core Web应用程序,您应该已经熟悉了Tag Helper.ASP.NET Core应用程序依赖Tag Helper来呈现表单和表单字段是很常见的.所以,一个视图通常包 ...

  9. Java的学习05

    今天学习了,Java中的LinkedList类.这个类需要用到链表的知识,以前一直以为,只有c/c++有链表.今天才知道,原来其他语言.也有链表,而且还是双向链表. /** * 自定义一个链表 * @ ...

  10. mac下配置Apache虚拟域名方案,以及遇到的坑

      1. 配置Apache虚拟域名 1.执行    sudo vi /etc/apache2/httpd.conf 开始配置httpd.conf 的文件; //配置listen 80端口(默认配置), ...