CF451E Devu and Flowers(容斥)

题目大意

\(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案。不一定每种花都要选到。

\(n\le 20\)

解法

利用可重组合的公式。

不考虑\(f_i\)的限制,直接可重组合的方案是,意思是从可以重复的\(n\)个元素中取出\(r\)个的个数。注意,根据定义,此时\(r\)种每个都要选。

\[f(s,r)={s+r-1 \choose r-1}
\]

考虑限制怎么办,我们先容斥。

我们可以钦定某些花选择了\(f_i+1\)次,代表这个花选出不合法的了。

那么为什么不是钦定\(f_i+0,2 \dots233666\dots \infin\) 呢?

是因为,我们钦定这种花选择了\(f_i+1\)后,就保证这种花超过限制了。

此时可重组合的公式仍然可以选择\(i\)号花,所以考虑到了\(i\)号花选择了\(\ge f_i+1\)的情况。

所以我们钦定\(f_i+1\)朵花就好了。

根据容斥原理,所有花不超过限制的方案数为

\[\Sigma_{t\subseteq S} (-1)^{|t|}f(s-\Sigma_{x\in t}(x_i+1)+r-1,r-1)
\]

  1. //@winlere
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. using namespace std; typedef long long ll;
  5. template < class ccf > inline ccf qr(ccf ret){ ret=0;
  6. register char c=getchar();
  7. while(not isdigit(c)) c=getchar();
  8. while(isdigit(c)) ret=ret*10+c-48,c=getchar();
  9. return ret;
  10. }inline int qr(){return qr(1);}
  11. const int maxn=25;
  12. const ll mod=1e9+7;
  13. inline ll Pow(ll base,ll p){
  14. base%=mod;
  15. register ll ret=1;
  16. for(;p;p>>=1,base=base*base%mod)
  17. if(p&1) ret=ret*base%mod;
  18. return ret;
  19. }
  20. ll data[maxn],s,ans,inv[maxn]={1},jie[maxn]={1};
  21. int n;
  22. inline ll C(const ll&n,const ll&m){
  23. if(n<m||m<0||n<0)return 0;
  24. if(n==m)return 1;
  25. register ll ret=inv[m];
  26. for(register ll t=n;t>=n-m+1ll;--t)
  27. ret=t%mod*ret%mod;
  28. return ret;
  29. }
  30. #undef int
  31. int main(){
  32. #define int long long
  33. #ifndef ONLINE_JUDGE
  34. freopen("in.in","r",stdin);
  35. //freopen("out.out","w",stdout);
  36. #endif
  37. for(register int t=1;t<maxn;++t)
  38. inv[t]=inv[t-1]*Pow(t,mod-2ll)%mod;
  39. n=qr();s=qr(1ll);ans=C(s+n-1ll,n-1ll);
  40. for(register int t=1;t<=n;++t)
  41. data[t]=qr(1ll);
  42. for(register int t=1,edd=1<<n,cnt=0;t<edd;++t){
  43. ll f=cnt=0,delt;
  44. for(register int i=1;i<=n;++i)
  45. if(t<<1>>i&1)
  46. f+=data[i]+1ll,++cnt;
  47. delt=C(s-f+n-1ll,n-1ll);
  48. if(cnt&1) ans=(ans-delt)%mod,ans=ans<0?ans+mod:ans;
  49. else ans=(ans+delt)%mod;
  50. }
  51. cout<<ans<<endl;
  52. return 0;
  53. }

CF451E Devu and Flowers(容斥)的更多相关文章

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

  2. CodeForces - 451E Devu and Flowers (容斥+卢卡斯)

    题意:有N个盒子,每个盒子里有fi 朵花,求从这N个盒子中取s朵花的方案数.两种方法不同当且仅当两种方案里至少有一个盒子取出的花的数目不同. 分析:对 有k个盒子取出的数目超过了其中的花朵数,那么此时 ...

  3. CF451E Devu and Flowers 解题报告

    CF451E Devu and Flowers 题意: \(Devu\)有\(N\)个盒子,第\(i\)个盒子中有\(c_i\)枝花.同一个盒子内的花颜色相同,不同盒子的花颜色不同.\(Devu\)要 ...

  4. CF451E Devu and Flowers (组合数学+容斥)

    题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入门题目 把取花 ...

  5. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  6. CF451E Devu and Flowers

    多重集求组合数,注意到\(n = 20\)所以可以用\(2 ^ n * n\)的容斥来写. 如果没有限制那么答案就是\(C(n + s - 1, n - 1)\).对每一个限制依次考虑,加上有一种选多 ...

  7. CF451E Devu and Flowers 数论

    正解:容斥+Lucas定理+组合数学 解题报告: 传送门! 先mk个我不会的母函数的做法,,, 首先这个题的母函数是不难想到的,,,就$\left (  1+x_{1}^{1}+x_{1}^{2}+. ...

  8. BZOJ1101 [POI2007]Zap 和 CF451E Devu and Flowers

    Zap FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到 ...

  9. CF451E Devu and Flowers(组合数)

    题目描述 Devu想用花去装饰他的花园,他已经购买了n个箱子,第i个箱子有fi朵花,在同一个的箱子里的所有花是同种颜色的(所以它们没有任何其他特征).另外,不存在两个箱子中的花是相同颜色的. 现在De ...

随机推荐

  1. [Functional Programming] Compose Simple State ADT Transitions into One Complex Transaction

    State is a lazy datatype and as such we can combine many simple transitions into one very complex on ...

  2. 数据结构与算法——优先队列类的C++实现(二叉堆)

    优先队列简单介绍: 操作系统表明上看着是支持多个应用程序同一时候执行.其实是每一个时刻仅仅能有一个进程执行,操作系统会调度不同的进程去执行. 每一个进程都仅仅能执行一个固定的时间,当超过了该时间.操作 ...

  3. python中ascii码和字符的转换

    将ASCII字符转换为对应的数值即‘a’-->65,使用ord函数,ord('a') 反正,使用chr函数,将数值转换为对应的ASCII字符,chr(65)

  4. Android Tabhost置于底部

    方法一: <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id=&qu ...

  5. ios多线程操作(四)—— GCD核心概念

    GCD全称Grand Central Dispatch.可译为"大派发中枢调度器",以纯C语言写成,提供了很多很强大的函数.GCD是苹果公司为多核的并行运算提出的解决方式,它能够自 ...

  6. 【LeetCode】Sort Colors 数组排序

    题目:Sort color <span style="font-size:18px;">/*LeetCode sort colors 题目:输入一个数组.包括0,1,2 ...

  7. JavaScript Array pop(),shift()函数

    pop() 删除数组的最后一个元素并返回删除的元素 shift() 删除并返回数组的第一个元素

  8. iOS开发 - 第05篇 - 项目 - 12 - 图文混排

    1.首页微博文字处理 对于之前微博项目中首页:微博文字中的用户名.话题.链接等文字须要高亮显示.表情字符串须要显示相应表情. 思路: 1>之前微博中的文字使用NSString,要达到不同文字的高 ...

  9. [LeetCode]Palindrome Number 推断二进制和十进制是否为回文

    class Solution { public: bool isPalindrome2(int x) {//二进制 int num=1,len=1,t=x>>1; while(t){ nu ...

  10. 小白学习HTTPS

    如果你和我一样是HTTPS的小白的话,那就一起来学习这个吧.争取把这篇博客写好,写全面,从原理到实践再到部署. 让我们先来模拟一个场景:当你嗨皮地敲着代码,你的老板偷偷摸摸跑到你的身边,"小 ...