题目链接

题目大意:

对于集合 \(\{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. ICO图标在线生成转换网站

    ico是Icon file的缩写,是Windows的图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件. 在Windows操作系统中,单个图标的文件名后缀是.ICO.这种格式的图标可以在W ...

  2. PostgreSQL与PostGIS安装使用时需要注意的坑

    最近些许繁忙,没有时间系统整理PostgreSQL和PostGIS的安装和使用方法.所以就简单记录一下遇到的坑. 1.找不到 libintl-9.dll 我安装的PostgreSQL版本是11.7,P ...

  3. 获取iframe的window对象

    在父窗口中获取iframe中的元素 // JS // 方法1: var iframeWindow = window.frames["iframe的name或id"]; iframe ...

  4. FreeRTOS --(4)内存管理 heap3

    转载自 https://blog.csdn.net/zhoutaopower/article/details/106677144 heap3 来说,是直接使用了 malloc 和 free 来直接替代 ...

  5. vue 时间过滤器

    过滤器:定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理).语法:1.注册过滤器: Vue.filter(name ,callback)或new Vue{filters:{}}2. ...

  6. JavaScript 数据结构与算法1(数组与栈)

    学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.数组 几乎所有的语言都原生支持数组类型,因为数组是 ...

  7. 【面试普通人VS高手系列】说说缓存雪崩和缓存穿透的理解,以及如何避免?

    听说10个人去互联网公司面试,有9个人会被问到缓存雪崩和缓存穿透的问题. 听说,这9个人里面,至少有8个人回答得不完整. 而这8个人里面,全都是在网上找的各种面试资料去应付的,并没有真正理解. 当然, ...

  8. MyCat安装和基本配置

    安装包下载 下载地址:http://dl.mycat.org.cn/ 我只这里下的是1.6Linux安装包:http://dl.mycat.org.cn/1.6.7.6/20220419132943/ ...

  9. Debouncer防抖代码

    Debouncer类 import java.util.concurrent.*; public class Debouncer { private final ScheduledExecutorSe ...

  10. 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库

    目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...