题目传送门


题目描述

一个有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]:集合计数(组合数学+容斥)的更多相关文章

  1. bzoj2839 集合计数(容斥)

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 883  Solved: 490[Submit][Status][Discuss] ...

  2. bzoj2839 集合计数(容斥+组合)

    集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出     题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...

  3. BZOJ2839 : 集合计数 (广义容斥定理)

    题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...

  4. 【BZOJ2839】集合计数(容斥,动态规划)

    [BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...

  5. 【BZOJ2839】集合计数 组合数+容斥

    [BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数 ...

  6. BZOJ 2839: 集合计数 广义容斥

    在一个 $N$ 个元素集合中的所有子集中选择若干个,且交集大小为 $k$ 的方案数. 按照之前的套路,令 $f[k]$ 表示钦定交集大小为 $k$,其余随便选的方案数. 令 $g[k]$ 表示交集恰好 ...

  7. BZOJ2839:集合计数(容斥,组合数学)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...

  8. bzoj2839: 集合计数 容斥+组合

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 523  Solved: 287[Submit][Status][Discuss] ...

  9. BZOJ2839 集合计数 容斥

    题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...

随机推荐

  1. Codeforces 1220C. Substring Game in the Lesson

    传送门 首先显然的,如果 $l$ 能移动,那么 $r$ 一定可以随便移动,如果 $l$ 不动,那么 $r$ 一定不能动 那么我们现在只要考虑 $l$ 的移动即可 考虑找到位置 $k$ 之前的最左边的最 ...

  2. C++中如何实现split的效果?

    C++中如何实现split的效果? 和Python等语言不同,C++的string类没有内置split函数,这对于实际应用中要经常分割字符串的情况非常不方便.有很多种方法来处理,这里讲一种比较方(to ...

  3. 史上最全的大厂Mysql面试题在这里

    1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中: 从:io线程——在使用star ...

  4. ERP和MES系统的区别和关系?

    1.ERP和MES的区别:ERP(Enterprise Resources Planning)是企业资源计划,它是在物料需求计划MRP(Material Requirement Planning)和制 ...

  5. Xcode中常用的快捷键(原文链接http://www.cocoachina.com/ios/20141224/10752.html)

    Xcode导航快捷键 1.工程导航器:Command+1 快速浏览代码.图片以及用户界面文件. 2.显示/隐藏导航器面板:Command+0 当你在对屏幕进行截图的时候可能会想要隐藏起与你感兴趣内容的 ...

  6. 2019-11-29-dotnet-使用-Qpush-快速从电脑到手机推送文字

    title author date CreateTime categories dotnet 使用 Qpush 快速从电脑到手机推送文字 lindexi 2019-11-29 08:58:57 +08 ...

  7. 去除多余的Merge branch提交

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xuexingyang/article/d ...

  8. 一、Core基于MVC的全局过滤器验证

    一.Core基于MVC的过滤器验证 1.添加一个过滤器.在Startup 中ConfigureServices方法里添加一个Filters 即我们自己授权代码类. public void Config ...

  9. SQL Server设置启动存储过程

    --设置开关 启动程序自动运行存储过程必须启动该命令 sp_configure "show advanced options",1; go reconfigure; go --设置 ...

  10. 015-Zabbix自动发现和自动注册

      前言 对于监控服务器越来越多的情况,如果还单独一个一个添加,那效率也太低,因此就要实现批量添加监控服务器的操作,Zabbix提供两种批量自动监控的方式: 自动发现:由服务端主动发起,Zabbix ...