题目传送门

【题目大意】

有n种颜色的花,第i种颜色的花有a[i]朵,从这些花中选m朵出来,问有多少种方案?答案对109+7取模

【思路分析】

这是一个多重集的组合数问题,答案就是:$$C_{n+m-1}^{n-1}-\sum_{i=1}^{n}C_{n+m-a[i]-2}^{n-1}+\sum_{1\le i<j\le n}C_{n+m-a[i]-a[j]-3}^{n-1}-…+(-1)^nC_{n+m-\sum_{i=1}^{n}a[i]-(n+1)}^{n-1}$$

在具体实现的时候,我们可以枚举x=0~2n-1,若x在二进制表示下共有p位为1,分别是第i[1],i[2]…i[p]位,则这个x就代表上式中的这一项:$$(-1)^pC_{n+m-a[i[1]]-a[i[2]]-…-a[i[p]]-(p+1)}^{n-1}$$

这样我们就可以成功地得到容斥原理计算多重集组合数的公式的每一项。

【代码实现】

 #include<bits/stdc++.h>
#define ll long long
#define go(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
ll a[],m,ans=;
int inv[],n;
const int mod=1e9+;
int ksm(int x,int y){
int as=;
while(y){
if(y&) as=(ll)as*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return as;
}
int C(ll y,int x){//计算组合数
if(y<||x<||x>y) return ;
y%=mod;
if(y==||x==) return ;
int as=;
go(i,,x-) as=(ll)as*(y-i)%mod;
go(i,,x) as=(ll)as*inv[i]%mod;
return as;
}
int main(){
go(i,,) inv[i]=ksm(i,mod-);//预处理逆元
scanf("%d%lld",&n,&m);
go(i,,n) scanf("%lld",&a[i]);
for(int x=;x<(<<n);x++){//枚举x
if(x==) ans=(ans+C(n+m-,n-))%mod;
else {
ll t=n+m;
int p=;
go(i,,n-)
if((x>>i)&) p++,t-=a[i+];
t-=p+;
if(p&) ans=(ans-C(t,n-))%mod;
else ans=(ans+C(t,n-))%mod;
}
}
cout<<(ans+mod)%mod<<endl;
return ;
}

代码戳这里

Luogu CF451E Devu and Flowers 题解报告的更多相关文章

  1. CF451E Devu and Flowers 解题报告

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

  2. CF451E Devu and Flowers(容斥)

    CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...

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

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

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

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

  5. [题解] [CF451E] Devu and Flowers

    题面 题解 就是一个求\(\sum_{i= 1}^{n}x _ i = m\)的不重复多重集的个数, 我们可以由容斥原理得到: \[ ans = C_{n + m - 1}^{n - 1} - \su ...

  6. CF451E Devu and Flowers 数论

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

  7. CF451E Devu and Flowers(组合数)

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

  8. CF451E Devu and Flowers

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

  9. Luogu P1082 同余方程(NOIP 2012) 题解报告

    题目传送门 [题目大意] 求关于x的同余方程 ax≡1(mod b)的最小整数解. [思路分析] 由同余方程的有关知识可得,ax≡1(mod b)可以化为ax+by=1,此方程有解当且仅当gcd(a, ...

随机推荐

  1. arts打卡 从排序数组中删除重复项

    Algorithm 从排序数组中删除重复项     给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组 ...

  2. 使用git 遇见的错误使用到的命令

    查看远端地址  git remote -v 需要重新添加地址  git remote set-url origin xxx 远程新的地址 git remote add origin_new 设置用户名 ...

  3. ztree 获取子节点所有父节点的name的拼接

    ztree 获取子节点所有父节点的name的拼接 //获取子节点,所有父节点的name的拼接字符串function getFilePath(treeObj){if(treeObj==null)retu ...

  4. [认证授权] 4.OIDC(OpenId Connect)身份认证(核心部分)

    1 什么是OIDC? 看一下官方的介绍(http://openid.net/connect/): OpenID Connect 1.0 is a simple identity layer on to ...

  5. RB-Tree删除详解

    红黑树的删除操作较于插入操作,情况更为复杂: 考虑到红黑节点的差异性,我们在此通过红黑节点来考虑这个问题,即仅仅通过要删除的节点是红节点,还是黑节点来讨论不同的情况: 1  删除的红节点为叶子结点(此 ...

  6. 如何用Eclipse创建一个JavaSwing的项目

    创建之前必须先给开发工具安装WindowBuilder插件(安装方法可自行百度) 方式一: 创建项目 new--other--WindowBuilder--SWT Designer----SWT/JF ...

  7. OpenStack端口(15)

    一.OpenStack组件使用的默认端口号 openstack openstack service default ports port type keystone Identity service ...

  8. ora-14400:插入的分区关键字未映射到任何分区

    参考:https://blog.csdn.net/rubychen410/article/details/5317553 出现该问题是由于: 1.为表设置了根据时间进行分区(PARTITION),而每 ...

  9. ansible copy 模块详解

    ansible 模块 copy one.概述 copy 模块的作用就是拷贝文件,它与之前介绍过的 fetch 模块类似,不过,fetch 模块是从远程主机中拉取文件到 ansible 管理主机,而 c ...

  10. Centos6.5-dnsmasq安装

    1.使用yum install dnsmasq -y 安装dns(含dns server和dns代理功能) 2.查询dnsmasq已经安装成功 [root@localhost ~]# rpm -q d ...