题目链接

题目大意:

对于集合 \(\{1,2,\dots,n\}\) ,求它的子集族中,有多少个满足:

  • 任意两个子集互不相同;
  • \(1,2,\dots,n\) 都在其中至少出现了 \(2\) 次。

答案对 \(M\) 取模。

看到这种东西就要想到容斥。

设 \(F_i\) 表示至少有 \(i\) 个数字只出现了一次。

更具体的,就是 \(F_i\) 个数只出现一次,其他的数出现次数随便。

由容斥我们可以知道:

\[Ans = \sum_{i=0}^n(-1)^iF_i
\]

我们来考虑这时 \(n-i\) 个随便的部分构成的方案数。

首先,这 \(n - i\) 个数随便定是否只出现了一次,可以看出方案数是 \(2^{n-i}\) 。

然后对于每一个得出的情况,我们都可以选或不选,所以就是 \(2^{2^{n-i}}\) 。

再来看从 \(n\) 个数选出 \(i\) 个一定出现一次的方案数 \(C_n^i\) 很简单。

如果我们设 \(f_i\) 表示恰好有 \(i\) 个数只出现了一次,那么可以得到:

\[F_i=f_i\times2^{2^{n-i}}\times C_n^i
\]

现在着手考虑 \(f_i\) 是怎么得到的。

我们设 \(g_{i,j}\) 表示 \(i\) 个只出现一次的数放到 \(j\) 个集合的方案数。

  • 当此时第 \(j\) 个集合没有不合法的数,此时 \(i\) 只能填在此处 \(\rightarrow g_{i-1,j-1}\)
  • 意味着 \(j\) 个集合里面都有不合法的数字了,这样的话第 \(i\) 个不合法的数可以选择加入到 \(j\) 个集合中任意一个,也可以不加入任何集合。(因为不是强制的) \(\rightarrow (j+1)g_{i-1,j}\)

非常显然的 \(g_{i,j}\) 自然是这两种情况的和。

\[g_{i,j}=g_{i-1, j-1}+(j+1)g_{i-1,j}
\]

最后我们枚举有几个集合里有非法的元素就可以了。

注意:除了不合法的数字一个集合中还可以有其他的元素,及 \((2^{n-i})^j\)

\[f_i=\sum_{j=0}^ig_{i,j}\times (2^{n-i})^j\\
Ans = \sum_{i=0}^n(-1)^i\times\sum_{j=0}^ig_{i,j}\times (2^{n-i})^j\times2^{2^{n-i}}\times C_n^i
\]

呃呃呃,这个 \(Ans\) 的式子可能有一点点乱。。。

Code

#include <cstdio>
#include <iostream>
#include <algorithm> #define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout) #define Enter putchar('\n')
#define quad putchar(' ') #define int long long
const int N = 3005; int n, mod, fac[N], g[N][N], ans; inline int power(int a, int n, int mod);
inline int C(int n, int m); signed main(void) {
std::cin >> n >> mod;
fac[0] = 1;
for (int i = 1; i <= n; i++)
fac[i] = fac[i - 1] * i % mod;
for (int i = 0; i <= n; i++) {
g[i][0] = 1;
for (int j = 1; j <= i; j++)
g[i][j] = (g[i - 1][j - 1] + (j + 1) * g[i - 1][j] % mod) % mod;
}
for (int i = 0, lala; i <= n; i++) {
int two = power(2, n - i, mod - 1);
two = power(2, two, mod);
int num = power(2, n - i, mod), F = 0, mul = 1;
for (int j = 0; j <= i; j++) {
F = (F + g[i][j] * mul) % mod;
mul = mul * num % mod;
}
if (i % 2 == 1) lala = mod - C(n, i);
else lala = C(n, i);
ans = (ans + F * lala % mod * two % mod) % mod;
ans = (ans % mod + mod) % mod;
}
std::cout << ans << std::endl;
return 0;
} inline int power(int a, int n, int mod) {
int ret = 1;
while (n) {
if (n & 1) ret = ret * a % mod;
a = a * a % mod;
n /= 2;
}
return ret;
}
inline int C(int n, int m) {
if (n < m) return 0;
int ret = fac[n];
ret = ret * power(fac[m], mod - 2, mod) % mod;
ret = ret * power(fac[n - m], mod - 2, mod) % mod;
return ret;
}

[ARC096C] Everything on It 补题记录的更多相关文章

  1. 【补题记录】ZJU-ICPC Summer Training 2020 部分补题记录

    补题地址:https://zjusummer.contest.codeforces.com/ Contents ZJU-ICPC Summer 2020 Contest 1 by Group A Pr ...

  2. 【JOISC 2020 补题记录】

    目录 Day 1 Building 4 Hamburg Steak Sweeping Day 2 Chameleon's Love Making Friends on Joitter is Fun R ...

  3. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  4. 【cf补题记录】Codeforces Round #607 (Div. 2)

    比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...

  5. Codeforces 1214 F G H 补题记录

    翻开以前打的 #583,水平不够场上只过了五题.最近来补一下题,来记录我sb的调试过程. 估计我这个水平现场也过不了,因为前面的题已经zz调了好久-- F:就是给你环上一些点,两两配对求距离最小值. ...

  6. Yahoo Programming Contest 2019 补题记录(DEF)

    D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...

  7. Codeforces 补题记录

    首先总结一下前段时间遇到过的一些有意思的题. Round #474 (Div. 1 + Div. 2, combined)   Problem G 其实关键就是n这个数在排列中的位置. 这样对于一个排 ...

  8. 【补题记录】NOIp-提高/CSP-S 刷题记录

    Intro 众所周知原题没写过是很吃亏的,突然发现自己许多联赛题未补,故开此坑. 在基本补完前会持续更新,希望在 NOIp2020 前填完. 虽然是"联赛题",但不少题目还是富有思 ...

  9. ZJUT11 多校赛补题记录

    牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...

随机推荐

  1. python基础练习题(九九乘法表)

    又把python捡起来了,动手能力偏弱,决定每日一练,把基础打好! ------------------------------------------------------------------ ...

  2. box-shadow-阴影,你真的懂吗

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  3. SpringCloudAlibaba微服务docker容器打包和部署示例实战

    概述 我们使用前面<SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(中)>的两个微服务示例,分别是库存微服务和订单微服务,基于Nacos注册中心和配置 ...

  4. 5个容易忽视的PostgreSQL查询性能瓶颈

    PostgreSQL 查询计划器充满了惊喜,因此编写高性能查询的常识性方法有时会产生误导.在这篇博文中,我将描述借助 EXPLAIN ANALYZE 和 Postgres 元数据分析优化看似显而易见的 ...

  5. 攻防世界-MISC:坚持60s

    这是攻防世界新手练习区的第六题,题目如下: 点击附件1下载,是一个java文件,点击运行一下: 绿帽子满天飞不知道是怎么回事(还是老老实实去看WP吧),WP说这是编译过的Java代码,但我手里没有反编 ...

  6. 一行代码如何隐藏 Linux 进程?

    开源Linux 长按二维码加关注~ 上一篇:IPv6技术白皮书(附PDF下载) 总有朋友问隐藏Linux进程的方法,我说你想隐藏到什么程度,是大隐于内核,还是小隐于用户.网上通篇论述的无外乎 hook ...

  7. Vulnhub-DC-4靶机实战

    前言 靶机下载地址:https://www.vulnhub.com/entry/dc-4,313/ KALI地址:192.168.75.108 靶机地址:192.168.75.207 一.信息发现 1 ...

  8. Jenkins安装详解

    一.Jenkins是什么 Jenkins是一个独立的开源自动化服务器,可用于自动执行与构建,测试,交付或者部署软件相关的各种任务,是跨平台持续集成和持续交付应用程序,提高工作效率.使用Jenkins不 ...

  9. 论文解读(SCGC))《Simple Contrastive Graph Clustering》

    论文信息 论文标题:Simple Contrastive Graph Clustering论文作者:Yue Liu, Xihong Yang, Sihang Zhou, Xinwang Liu论文来源 ...

  10. 安装Speedtest到Python

    Speedtest模块可以测试主机的网络带宽大小. 运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:无 硬件要求:无 安装过程 1.安装Spee ...