题目

一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集),

现在要在这 \(2^N\) 个集合中取出若干集合(至少一个),

使得它们的交集的元素个数为 \(K\) ,求取法的方案数,答案模 \(1000000007\) 。

\((1 \le N \le 10^6, 0 \le K \le N)\)

题解

又是一道 裸的 广义容斥定理 还没这道题难qwq

广义容斥定理 (二项式反演) :

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

\[\Updownarrow
\]

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

不难发现又是一个恰好 我们转化成至少就行了

那么交集有至少 \(i\) 个集合的个数 \(b_i\) 就是

\[\displaystyle b_i = \binom n i 2^{2^{n-i}}
\]

一开始我以为后面那个直接是 \(2^{n-i}\) .... 没过样例搜了波题解... 发现是 \(2^{2^{n-i}}\) qwq

为什么呢 我们这样考虑 当前枚举了一个大小为 \(i\) 交集后 还剩下 \(n-i\) 个元素

每个元素有选和不选的两种方案 那么共有 \(2^{n-i}\) 个互不相同的集合

那么每个集合我们又有选和不选两种方案 那么总共就是 \(2^{2^{n-i}}\) 种咯qwq

然后套上去 答案就是

\[\displaystyle \mathrm{ans} = \sum_{i=k}^{n} (-1)^{i-k} \binom i k b_i
\]

代码

#include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std; inline bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
inline bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * fh;
} void File() {
#ifdef zjp_shadow
freopen ("P2839.in", "r", stdin);
freopen ("P2839.out", "w", stdout);
#endif
} typedef long long ll;
const ll Mod = 1e9 + 7;
ll fpm(ll x, int power) {
ll res = 1;
for (; power; power >>= 1, (x *= x) %= Mod)
if (power & 1) (res *= x) %= Mod;
return res;
} const int N = 1e6;
ll fac[N + 100], ifac[N + 100], pow2[N + 100], ppow2[N + 100];
void Init(int maxn) {
fac[0] = ifac[0] = pow2[0] = ppow2[0] = 1;
For (i, 1, maxn) fac[i] = fac[i - 1] * i % Mod, pow2[i] = pow2[i - 1] * 2 % Mod, ppow2[i] = ppow2[i - 1] * 2 % (Mod - 1);
ifac[maxn] = fpm(fac[maxn], Mod - 2);
Fordown (i, maxn - 1, 1) ifac[i] = ifac[i + 1] * (i + 1) % Mod;
} ll ans = 0; ll C(int n, int m) {
if (n < 0 || m < 0 || n < m) return 0;
return fac[n] * ifac[m] % Mod * ifac[n - m] % Mod;
} int main () {
File();
Init(N);
int n = read(), k = read();
For (i, k, n)
(ans += Mod + ((i - k) & 1 ? -1 : 1) * (C(i, k) * C(n, i) % Mod * fpm(2, ppow2[n - i]) % Mod)) %= Mod;
printf ("%lld\n", ans);
return 0;
}

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. BZOJ 2839: 集合计数 广义容斥

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

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

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

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

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

  6. bzoj 2839 集合计数 容斥\广义容斥

    LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...

  7. How Many Sets I(容斥定理)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3556 How Many Sets I Time Limit: 2 ...

  8. UVA-11806 Cheerleaders 计数问题 容斥定理

    题目链接:https://cn.vjudge.net/problem/UVA-11806 题意 在一个mn的矩形网格里放k个石子,问有多少方法. 每个格子只能放一个石头,每个石头都要放,且第一行.最后 ...

  9. 51nod1284容斥定理

    1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题   给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如N = 10, ...

随机推荐

  1. 02-Centos7安装部署Mirrorgate

    1.以Docker方式运行 MirrorGate服务器作为docker镜像提供,因此要运行它只需在终端中执行以下命令: 注意mongo镜像要使用3.6版本,其他版本会提示版本问题. #Spinup m ...

  2. HTML5-应用程序缓存(Application Cache)

    一.什么是应用程序缓存? HTML5 引入了应用程序缓存(Application Cache),这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 二.优势 离线浏览 - 用户可在应用 ...

  3. ASP.NET RAZOR自动生成的js Timer

    <input type="hidden" value="@(Model.TimeLength)" id="examTimeLength" ...

  4. [转]curl的错误代码

    转贴者按: 今天在使用curl的时候碰到了一个错误,如下所示: External Program Failed: D:\Tools\curl\curl.exe (return code was 18) ...

  5. el标签将时间戳转换为特定格式以及将数值保留特定小数

    jsp中/el表达式中将后台传来的时间戳格式化为年月日时分秒 1.引入相关标签库 <%@taglib prefix="c" uri="http://java.sun ...

  6. 在Windows7上如何找到Cookie

    摘要 出于兴趣爱好,前一阵子做了一个网页,网页中需要用到Cookie,但是,根据书上的说明,并没有找打教材中所说的Cookie的位置,本文就主要介绍在计算机(Win7)中Cookie的存放位置,同样适 ...

  7. 网站响应式布局/网站自适应问题+rem、em、px、pt及网站字体大小设配

    Bootstrap 网格系统: Bootstrap CSS: Bootstrap 组件及插件: 一.什么是响应式布局?       响应式布局是Ethan Marcotte在2010年5月份提出的一个 ...

  8. vs2015安装及初步试用

    Vs2015一直都听说好用,便捷.之前用vc++6.0,总感觉界面很灰,让人编程兴趣不高,恰巧借此机会,安装一下vs2015,从编译器上体验下编程的舒心,方便.希望我不会变得太懒... 首先,我下的是 ...

  9. M2postmortem

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 答:我们的软件主要解决信息提取的问题.定义清晰:要提取的内容包括于计算机科学相关内容的标题.作者. ...

  10. Linux课题实践五——字符集总结与分析

    Linux课题实践三——字符集总结与分析 20135318  刘浩晨 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字 ...