[BZOJ2839]:集合计数(组合数学+容斥)
题目传送门
题目描述
一个有N个元素的集合有${2}^{N}$个不同子集(包含空集),现在要在这${2}^{N}$个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007。(是质数喔~)
输入格式
一行两个整数N,K。
输出格式
一行为答案。
样例
样例输入:
3 2
样例输出:
6
样例说明
假设原集合为{A,B,C}
则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB},{AC},{BC}
数据范围与提示
对于100%的数据,1≤N≤16;0≤K≤N;
题解
我也不知道为什么看到这道题就像到了组合数学和容斥,别问我为什么。
好叭~既然你这么可爱……那就……
其实,我感觉叭……这种什么什么集合的题,要是你一秒想不出来什么算法,就往容斥去想吧,个人感觉基本上就是容斥了。
反正是容斥你就赚了,不是你也不亏(反正你也不会,不不不,您是最神的)。
言归正转(其实刚才也不是废话叭~):
首先是组合数学,既然自己很执着就往组合数学上去想吧。
显然,问题可以转化为先在n个数里选k个,然后在剩下的数中选出任意多个集合,使他们的交集为空集即可。
这时候答案即为:ans=(一堆数,我也不知道有多大)×$C_{n}^{k}$。
然后“我也不知道有多大”的数看样子很难求,它们会组成${2}^{n-k}$个集合,然后你还要从这些集合当中去选,让它们没有交集,那我估计你有钱的话可以让它先跑着,自己冷冻个几百年没准它能算完?不好说~
那么显然不能这样,怎么办?
我说了还有容斥。
那么我们考虑让它们的交集为i(i=[k,n],i∈N*)。
从这n个元素中选出i个元素,剩下的n-i个元素可以组成${2}^{n-i}$个不同的集合,然后这些集合还有${2}^{{2}^{n-i}}$-1种组合,-1是因为我们不能什么也不选。
方案数即为$C_{n}^{i}$×$C_{i}^{k}$×(${2}^{{2}^{n-i}}$-1)。
这时候就要考虑我们伟大的容斥了,奇加偶减即可。
代码时刻
#include<bits/stdc++.h>
using namespace std;
long long n,k;
long long ans;
long long jc[1000005],inv[1000005];
long long qpow(long long x,long long y,long long mod)//快速幂
{
long long ans=1;
while(y)
{
if(y%2)ans=(ans*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return ans;
}
void pre_work()//预处理
{
jc[0]=1;
for(long long i=1;i<=1000000;i++)
jc[i]=(jc[i-1]*i)%1000000007;
inv[1000000]=qpow(jc[1000000],1000000005,1000000007);
for(long long i=999999;i>=0;i--)
inv[i]=(inv[i+1]*(i+1))%1000000007;
}
long long cm(long long n,long long m){return jc[n]*inv[m]%1000000007*inv[n-m]%1000000007;}//求C
int main()
{
pre_work();
scanf("%lld%lld",&n,&k);
int flag=1;//用来奇加偶减
for(long long i=k;i<=n;i++)
{
ans=(ans+(((cm(n,i)*cm(i,k))%1000000007*(qpow(2,qpow(2,n-i,1000000006),1000000007)-1))%1000000007)*flag%1000000007)%1000000007;//式子,注意容斥
flag=-flag;
}
cout<<(ans+1000000007)%1000000007;//因为最后一步可能是一个减,所以注意要+mod再%mod
return 0;
}
rp++
[BZOJ2839]:集合计数(组合数学+容斥)的更多相关文章
- bzoj2839 集合计数(容斥)
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 883 Solved: 490[Submit][Status][Discuss] ...
- bzoj2839 集合计数(容斥+组合)
集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...
- BZOJ2839 : 集合计数 (广义容斥定理)
题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...
- 【BZOJ2839】集合计数(容斥,动态规划)
[BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...
- 【BZOJ2839】集合计数 组合数+容斥
[BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数 ...
- BZOJ 2839: 集合计数 广义容斥
在一个 $N$ 个元素集合中的所有子集中选择若干个,且交集大小为 $k$ 的方案数. 按照之前的套路,令 $f[k]$ 表示钦定交集大小为 $k$,其余随便选的方案数. 令 $g[k]$ 表示交集恰好 ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...
- BZOJ2839 集合计数 容斥
题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...
随机推荐
- Layui关闭弹出层并刷新父窗口
先确保已经引入layui和jquery 再确保初始化layer弹出层 <script> layui.use(['form', 'layer'], function() { var form ...
- vue中如何去掉空格
一.问题 vue中当用户提交表单时,有的数据需要去掉前后空格然后再向后端发送. 二.解决方法 首先可以使用v-model.trim这个v-model修饰符去解决它,但是当用户输入\u200B时,这个方 ...
- DAX/PowerBI系列 - 累计总计(Cumulative Total, Running Total)
DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 2019/08/08 更新:在可视化数据的时候,一定要选择日期维度的日期列 ...
- [JavaScript] es6规则总结
let 和 const let 是块级作用域 let 声明的变量只在其所在的作用域内生效 <script> { var today = "周3"; let yester ...
- Jpa/Hibernate 字节码增强:字段延迟加载
JPA提供了@Basic注解,实现延迟加载字段的功能,如下: @Basic(fetch = FetchType.LAZY) @Column(name = "REMARK_CONTENT&qu ...
- 77. Combinations (JAVA)
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- Java面试总结 -2018(补录)
参考详见:https://blog.csdn.net/jackfrued/article/details/44921941 https://blog.csdn.net/jackfrued/articl ...
- host - 使用域名服务器查询主机名字
SYNOPSIS (总览) host [-l ] [-v ] [-w ] [-r ] [-d ] [-t querytype ] [-a ] host [server ] DESCRIPTION (描 ...
- SpringMVC与Json数据交互
简单回顾了一下SpringMVC和前端JSON数据是怎么交互的 接下来详细说一下过程 前端代码写的很简单 主要是为了试验一下JSON数据的前后台传递 前端代码给大家发出来 其实真的很简单 前端接受了 ...
- DevExpress v19.1新版亮点——WinForms篇(五)
行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...