[ARC096C] Everything on It 补题记录
题目链接
题目大意:
对于集合 \(\{1,2,\dots,n\}\) ,求它的子集族中,有多少个满足:
- 任意两个子集互不相同;
- \(1,2,\dots,n\) 都在其中至少出现了 \(2\) 次。
答案对 \(M\) 取模。
看到这种东西就要想到容斥。
设 \(F_i\) 表示至少有 \(i\) 个数字只出现了一次。
更具体的,就是 \(F_i\) 个数只出现一次,其他的数出现次数随便。
由容斥我们可以知道:
\]
我们来考虑这时 \(n-i\) 个随便的部分构成的方案数。
首先,这 \(n - i\) 个数随便定是否只出现了一次,可以看出方案数是 \(2^{n-i}\) 。
然后对于每一个得出的情况,我们都可以选或不选,所以就是 \(2^{2^{n-i}}\) 。
再来看从 \(n\) 个数选出 \(i\) 个一定出现一次的方案数 \(C_n^i\) 很简单。
如果我们设 \(f_i\) 表示恰好有 \(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}\) 自然是这两种情况的和。
\]
最后我们枚举有几个集合里有非法的元素就可以了。
注意:除了不合法的数字一个集合中还可以有其他的元素,及 \((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 补题记录的更多相关文章
- 【补题记录】ZJU-ICPC Summer Training 2020 部分补题记录
补题地址:https://zjusummer.contest.codeforces.com/ Contents ZJU-ICPC Summer 2020 Contest 1 by Group A Pr ...
- 【JOISC 2020 补题记录】
目录 Day 1 Building 4 Hamburg Steak Sweeping Day 2 Chameleon's Love Making Friends on Joitter is Fun R ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
- 【cf补题记录】Codeforces Round #607 (Div. 2)
比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...
- Codeforces 1214 F G H 补题记录
翻开以前打的 #583,水平不够场上只过了五题.最近来补一下题,来记录我sb的调试过程. 估计我这个水平现场也过不了,因为前面的题已经zz调了好久-- F:就是给你环上一些点,两两配对求距离最小值. ...
- Yahoo Programming Contest 2019 补题记录(DEF)
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
- Codeforces 补题记录
首先总结一下前段时间遇到过的一些有意思的题. Round #474 (Div. 1 + Div. 2, combined) Problem G 其实关键就是n这个数在排列中的位置. 这样对于一个排 ...
- 【补题记录】NOIp-提高/CSP-S 刷题记录
Intro 众所周知原题没写过是很吃亏的,突然发现自己许多联赛题未补,故开此坑. 在基本补完前会持续更新,希望在 NOIp2020 前填完. 虽然是"联赛题",但不少题目还是富有思 ...
- ZJUT11 多校赛补题记录
牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...
随机推荐
- ICO图标在线生成转换网站
ico是Icon file的缩写,是Windows的图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件. 在Windows操作系统中,单个图标的文件名后缀是.ICO.这种格式的图标可以在W ...
- PostgreSQL与PostGIS安装使用时需要注意的坑
最近些许繁忙,没有时间系统整理PostgreSQL和PostGIS的安装和使用方法.所以就简单记录一下遇到的坑. 1.找不到 libintl-9.dll 我安装的PostgreSQL版本是11.7,P ...
- 获取iframe的window对象
在父窗口中获取iframe中的元素 // JS // 方法1: var iframeWindow = window.frames["iframe的name或id"]; iframe ...
- FreeRTOS --(4)内存管理 heap3
转载自 https://blog.csdn.net/zhoutaopower/article/details/106677144 heap3 来说,是直接使用了 malloc 和 free 来直接替代 ...
- vue 时间过滤器
过滤器:定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理).语法:1.注册过滤器: Vue.filter(name ,callback)或new Vue{filters:{}}2. ...
- JavaScript 数据结构与算法1(数组与栈)
学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.数组 几乎所有的语言都原生支持数组类型,因为数组是 ...
- 【面试普通人VS高手系列】说说缓存雪崩和缓存穿透的理解,以及如何避免?
听说10个人去互联网公司面试,有9个人会被问到缓存雪崩和缓存穿透的问题. 听说,这9个人里面,至少有8个人回答得不完整. 而这8个人里面,全都是在网上找的各种面试资料去应付的,并没有真正理解. 当然, ...
- MyCat安装和基本配置
安装包下载 下载地址:http://dl.mycat.org.cn/ 我只这里下的是1.6Linux安装包:http://dl.mycat.org.cn/1.6.7.6/20220419132943/ ...
- Debouncer防抖代码
Debouncer类 import java.util.concurrent.*; public class Debouncer { private final ScheduledExecutorSe ...
- 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库
目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...