「BZOJ2839」集合计数

题目大意:

一个包含 \(n\) 个数的集合有 \(2^n\) 个子集,从这些子集中取出若干个集合(至少一个),使他们的交集的元素个数恰好为 \(k\),求方案数,答案对 \(1e9+7\) 取模。


首先考虑一个很直观的思路:我们钦定 \(k\) 个数是他们的交集,则这样的方案数为 \(\binom{n}{k}\) ,同时,包含这 \(k\) 个数的集合个数为 \(2^{n-k}\) ,每个集合有选与不选两个状态,但依据题意,不能够全部不选,所以这样得到的总方案数 \(b_k\)为

\[b_k=\binom{n}{k}(2^{2^{n-k}}-1)
\]

但这样求出来的结果并不是我们想要的,设这些集合真实的交集集合 \(j\) 个数组成的集合为 \(A\),钦定的 \(k\) 个数组成的集合为 \(B\) ,则当\(B \subseteq A\) 时, 那么这个方案就会被统计一次,总共就会被统计 \(\binom j k\) 次。

设交集中恰好有 \(k\) 个元素的方案数为 \(a_k\),则有

\[b_k=\sum_{i=k}^n \binom i k a_i
\]

然后这里,我们可以利用容斥原理来推出,但更方便的是使用二项式反演,即

\[f(k)=\sum_{i=k}^n \binom i k g(i) \iff g(k)=\sum_{i=k}^n (-1)^{i-k} \binom i k f(i)
\]

这个式子可以通过直接将前式代入得到。

同样,二项式反演也还有另一种形式

\[f(n)=\sum_{i=k}^n \binom n i g(i) \iff g(n)=\sum_{i=k}^n (-1)^{n-i}\binom n i f(i)
\]

证明方法类似,在此不作赘述。

关于这道题,我们直接反演一下即可得到答案,即

\[a_k=\sum_{i=k}^n (-1)^{i-k}\binom i k \binom n k(2^{2^{n-k}}-1)
\]

时间复杂度为 \(O(n)\)。

\(\texttt{Code:}\)

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll p=1e9+7;
const ll maxn=1e6+5;
ll ksm(ll a,ll b,ll p){
ll ans=1;
for(;b;b>>=1,a=1ll*a*a%p)
if(b&1) ans=1ll*ans*a%p;
return ans;
}
ll fac[maxn],inv[maxn];
ll C(ll n,ll m){
if(n<m) return 0;
return 1ll*fac[n]*inv[m]%p*inv[n-m]%p;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll n,k;
cin>>n>>k;
fac[0]=1;
for(ll i=1;i<=n;++i) fac[i]=1ll*fac[i-1]*i%p;
inv[n]=ksm(fac[n],p-2,p);
for(ll i=n-1;i>=0;--i) inv[i]=1ll*inv[i+1]*(i+1)%p;
ll ans=0;
for(ll i=k;i<=n;++i){
ans=(ans+1ll*((i-k)&1?(-1):(1))*(C(i,k)*C(n,i)%p*(ksm(2,ksm(2,n-i,p-1),p)%p-1+p))%p+p)%p;
}
cout<<ans<<'\n';
return 0;
}

「BZOJ2839」集合计数的更多相关文章

  1. 【BZOJ2839】集合计数&&【BZOJ3622】已经没有什么好害怕的了

    再谈容斥原理来两道套路几乎一致的题目[BZOJ2839]集合计数Description一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交 ...

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

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

  3. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

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

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

  5. 「 深入浅出 」集合Map

    系列文章: 「 深入浅出 」java集合Collection和Map 「 深入浅出 」集合List 「 深入浅出 」集合Set 前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍M ...

  6. 「 深入浅出 」集合Set

    系列文章 「 深入浅出 」集合List 「 深入浅出 」java集合Collection和Map Set继承自Collection接口,不能包含有重复元素.本篇文章主要讲Set中三个比较重要的实现类: ...

  7. 「 深入浅出 」集合List

    第一篇文章 「 深入浅出 」java集合Collection和Map 主要讲了对集合的整体介绍,本篇文章主要讲List相对于Collection新增的一些重要功能以及其重要子类ArrayList.Li ...

  8. 【BZOJ-2839】集合计数 容斥原理 + 线性推逆元 + 排列组合

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

  9. 「Foundation」集合

    一.NSArray和NSMutableArray (一)NSArray不可变数组 (1)NSArray的基本介绍 NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组 ...

随机推荐

  1. 在gitlab网页上合并分支

    在gitlab网页上合并分支 使用gitlab网页将代码合并分 下面将dev分支代码合并至master 1.点击request merge 2.源分支为当前分支,目标分支默认为master,确认无误, ...

  2. 转载 | python inferface使用

    Python中最特别的关键字之一便是pass,它放在类或函数里,表示类和函数暂不定义. class PassClass: pass def PassFun(): pass 如上实现最精简的类和函数定义 ...

  3. Paxos 图解 (秒懂)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  4. Waymo object detect 2D解决方案论文拓展

    FixMatch 半监督中的基础论文,自监督和模型一致性的代表作. Consistency regularization: 无监督学习的方式,数据\(A\)和经过数据增强的\(A\)计做\(A'\) ...

  5. 【题解】poj 3254 Corn Fields

    题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的玉米,供 ...

  6. React-Antd4的Form表单校验

    之前很少用react做项目,最近入职新公司,用的react,在自己的摸索过程中,慢慢会记录一些使用方法.今天简单记录一下使用antd 4.0版本的Form表单校验,直接代码. 需要购买阿里云产品和服务 ...

  7. 每日三道面试题,通往自由的道路5——JVM

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然我们聊到了JVM,那我们继续这一个话题 ...

  8. vim安装及个性化配置

    1.安装vim,并且vim命令的别名设置为vi yum install vim -y (如果不能识别vim命令,需要先安装vim) vi /etc/bashrc 或者 vi ~/.bashrc 在最后 ...

  9. Redis6使用指导(完整版)

    一.Nosql与Redis概述 二.Redis6安装 三.常用五大数据类型 四.Redis6配置文件详解 五.Redis6的发布和订阅 六.Redis6新数据类型 七.Jedis操作Redis6(Ma ...

  10. 15、linux文件、目录的权限及如何改变权限(root用户不受任何权限的限制)

    15.1.linux普通文件的读.写.执行权限说明: r:读,表示具有读取\阅读文件内容的权限: w:可写,表示具有新增,修改文件内容的权限: 如果没有r配合,那么vi编辑文件会提示无法编辑(但可以强 ...