「ARC096C」Everything on It
Solution
容斥,钦定 \(i\) 个数 \(\leq 1\) 次。
其中 \(F(i)\) 表示有 \(i\) 个数的出现次数 \(\leq 1\) 次,剩余 \(n-i\) 个数随意的方案数。
方便起见,不妨设这 \(i\) 个数为 \(1,2,\cdots,i\)。可以把所有子集族中的子集分成两类:
- 含有 \(1,2,\cdots,i\) 中至少一个
- 不含
先考虑第 \(2\) 类。没有任何限制条件,剩余的 \(n-i\) 个数随便选,构成 \(2^{n-i}\) 个子集,每个子集要么选要么不选,那么有 \(2^{2^{n-i}}\) 个子集族。
再来考虑第一类。枚举 \(k\),表示第一类集合的个数。\(1,2,\cdots,i\) 这 \(i\) 个数要么不出现要么只出现一次,相当于有 \(i\) 个数,分入 \(k\) 个集合,有些数可以不分。考虑再加一个集合(“垃圾堆”),把不分的那些数(即没有出现的数)丢进去。有两种想法,结果是一样的:
- 分“垃圾堆”是否非空讨论,方案数为 \(\begin{Bmatrix}i\\k\end{Bmatrix}+(k+1)\begin{Bmatrix}i\\k+1\end{Bmatrix}\)(前面是所有数都分入集合了的方案数,后面是有些数没有分,乘以 \((k+1)\) 是因为不知道哪个集合是“垃圾堆”)。发现这就是第二类斯特林数的递推式,因此方案数为 \(\begin{Bmatrix}i+1\\k+1\end{Bmatrix}\)。
- 再加入一个 \(0\) 丢到“垃圾堆”,从而使垃圾堆非空,且 \(0\) 所在的就是垃圾堆。方案数为 \(\begin{Bmatrix}i+1\\k+1\end{Bmatrix}\)。
对于第一类的每个集合而言,\(>i\) 的 \(n-i\) 个数可出现可不出现。因此方案数为 \(\begin{Bmatrix}i+1\\k+1\end{Bmatrix}\cdot (2^{n-i})^k\)。
得到:
(枚举的 \(k\) 是第一类集合的个数)
综上:
注意,\(2^{2^{n-i}}\equiv 2^{2^{n-i}\bmod (p-1)}\pmod p\)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+5;
int n,mod,s[N][N],c[N][N],ans;
int mul(int x,int n,int mod){
int ans=mod!=1;
for(x%=mod;n;n>>=1,x=x*x%mod)
if(n&1) ans=ans*x%mod;
return ans;
}
signed main(){
scanf("%lld%lld",&n,&mod);
c[0][0]=1,s[0][0]=1;
for(int i=1;i<=n+1;i++){
c[i][0]=1;
for(int j=1;j<=i;j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
s[i][j]=(s[i-1][j]*j%mod+s[i-1][j-1])%mod;
}
}
for(int i=0;i<=n;i++){
int sum=0,p=mul(2,mul(2,n-i,mod-1),mod);
for(int k=0;k<=i;k++)
sum=(sum+s[i+1][k+1]*mul(2,(n-i)*k,mod)%mod*p)%mod;
ans=(ans+(i&1?mod-1:1)*c[n][i]%mod*sum%mod)%mod;
}
printf("%lld\n",ans);
return 0;
}
「ARC096C」Everything on It的更多相关文章
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
随机推荐
- Shell 管道指令pipe
目录 管道命令pipe 选取命令 cut.grep cut 取出需要的信息 grep 取出需要行.过滤不需要的行 排序命令 sort.wc.uniq sort 排序 假设三位数,按十位数从小到大,个位 ...
- STL学习笔记1
STL六大部件 容器.分配器.算法.迭代器.适配器.仿函数 他们的关系如下
- Linux信号1
信号(signal)是一种软中断,他提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某进程发生了什么事件,还可以给 ...
- Docker学习(一)——安装docker
Suse12上安装docker 对于suse13.2之后的版本,因为docker已经被添加到了suse仓库中,直接使用sudo zypper install docker即可. suse12不 ...
- gitlab之实战部署
#:准备Java环境,安装jdk root@ubuntu:~# cd /usr/local/src/ root@ubuntu:/usr/local/src# ls jdk-8u191-linux-x6 ...
- 【AWS】【Basis】基础概念
1.基础服务类型: 1.1. 链接: 官方文档,很详细:https://www.amazonaws.cn/products/#compute_networking/?nc1=f_dr 这个是一个whi ...
- Django REST framework完全入门
Django REST framework 一个强大灵活的Django工具包,提供了便捷的 REST API 开发框架 我们用传统的django也可以实现REST风格的api,但是顶不住Django ...
- .net core Winform 添加DI和读取配置、添加log
首先新建配置类 public class CaptureOption { /// <summary> /// 是否自启 /// </summary> public bool A ...
- java多线程7:ReentrantReadWriteLock
真实的多线程业务开发中,最常用到的逻辑就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务), 这样做虽然保证了实例变量的线程安全性, ...
- CSS中上下margin的传递和折叠
CSS中上下margin的传递和折叠 1.上下margin传递 1.1.margin-top传递 为什么会产生上边距传递? 块级元素的顶部线和父元素的顶部线重叠,那么这个块级元素的margin-top ...