题意:n<20个箱子,每个里面有fi朵颜色相同的花,不同箱子里的花颜色不同,要求取出s朵花,问方案数

题解:假设不考虑箱子的数量限制,隔板法可得方案数是c(s+n-1,n-1),当某个箱子里的数量超过fi时,方案数是c(s-f[i]-1+n-1,n-1),容斥原理求,状压枚举哪几个箱子超过了f[i],答案就是超过0个-超过1个+超过2个...

由于c(n,m)的m很小,直接暴力求解

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
//#include <bits/extc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define mt make_tuple
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define ld long double
//#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
#define bpc __builtin_popcount
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
#define mr mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std;
//using namespace __gnu_pbds; const ull ba=233;
const db eps=1e-5;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f3f; ll s,a[30],inv[30];
ll c(ll a,ll b)
{
ll ans=1;
for(ll i=a;i>=a-b+1;i--)ans=ans*(i%mod)%mod;
return ans*inv[b]%mod;
}
int main()
{
inv[0]=1;
for(int i=1;i<30;i++)inv[i]=inv[i-1]*qp(i,mod-2)%mod;
int n;
scanf("%d%lld",&n,&s);
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
ll ans=0;
for(int i=0;i<(1<<n);i++)
{
int f=0;
ll sum=0;
for(int j=0;j<n;j++)if((i>>j)&1)
{
sum+=a[j]+1;
f^=1;
}
if(sum>s)continue;
if(!f)add(ans,c(s-sum+n-1,n-1));
else sub(ans,c(s-sum+n-1,n-1));
}
printf("%lld\n",ans);
return 0;
}
/******************** ********************/

最新文章

  1. cookie 保存上次访问url方法
  2. 卸载已经安装的rpm包
  3. HighchartsJS创建环形带标识的图表实例
  4. Android开发--LinearLayout的应用
  5. What is Requirement ?
  6. CSS第一天总结
  7. SQL 语句日期用法及函数
  8. Android加速度传感器实现“摇一摇”,带手机振动
  9. swift基础--运算符
  10. jQuery实现按Enter键触发事件?
  11. Mysql命令-以NULL做where条件过滤时应该写 IS NULL;
  12. KVM之五:KVM日常管理常用命令
  13. 安卓高级EventBus使用详解
  14. SharePoint 列表项通过自定义WebService读取
  15. kaldi的TIMIT实例三
  16. API接口开发(持续更新)
  17. 设计模式のBuilderPattern(创建者模式)----创建模式
  18. css选择器:基本选择器
  19. 通过plsql develop查看建表语句
  20. xe5 android tts(Text To Speech) [转]

热门文章

  1. OSI七层网络模型分别是哪七层?各运行那些协议?
  2. 采用多个数据源是Spring的配置
  3. Map获取键值,Map的几种遍历方法 (转载)
  4. Python匹马行天下之初识python!
  5. The Battle of Chibi
  6. [JZOJ2865]【集训队互测 2012】Attack
  7. scala中异常捕获与处理简单使用
  8. luoguP1154 奶牛分厩 [数论]
  9. BZOJ 1089 (SCOI 2003) 严格n元树
  10. PandorBox 中安装aria2失败的解决办法