Solution

容斥,钦定 \(i\) 个数 \(\leq 1\) 次。

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

其中 \(F(i)\) 表示有 \(i\) 个数的出现次数 \(\leq 1\) 次,剩余 \(n-i\) 个数随意的方案数。

方便起见,不妨设这 \(i\) 个数为 \(1,2,\cdots,i\)。可以把所有子集族中的子集分成两类:

  1. 含有 \(1,2,\cdots,i\) 中至少一个
  2. 不含

先考虑第 \(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\)。

得到:

\[F(i)=\sum_{k=0}^i \begin{Bmatrix}i+1\\k+1\end{Bmatrix}\cdot 2^{(n-i)k}\cdot 2^{2^{n-i}} \]

(枚举的 \(k\) 是第一类集合的个数)

综上:

\[Ans=\sum_{i=0}^n (-1)^i\binom{n}{i}\times \sum_{k=0}^i \begin{Bmatrix}i+1\\k+1\end{Bmatrix}\cdot 2^{(n-i)k}\cdot 2^{2^{n-i}} \]

注意,\(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的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「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 =& ...

随机推荐

  1. 日常Java(测试 (二柱)修改版)2021/9/22

    题目: 一家软件公司程序员二柱的小孩上了小学二年级,老师让家长每天出30道四则运算题目给小学生做. 二柱一下打印出好多份不同的题目,让孩子做了.老师看了作业之后,对二柱赞许有加.别的老师闻讯, 问二柱 ...

  2. A Child's History of England.25

    It was a September morning, and the sun was rising, when the King was awakened from slumber by the s ...

  3. deque、queue和stack深度探索(上)

    deque是可双端扩展的双端队列,蓝色部分就是它的迭代器类,拥有四个指针,第一个cur用来指向当前元素,first指向当前buffer头部,last指向当前buffer尾部,node指向map自己当前 ...

  4. Linux FTP的主动模式与被动模式

    Linux FTP的主动模式与被动模式 一.FTP主被动模式        FTP是文件传输协议的简称,ftp传输协议有着众多的优点所以传输文件时使用ftp协议的软件很多,ftp协议使用的端口是21( ...

  5. Kotlin 学习(2)

    属性和字段 1.声明属性 Kotlin中可以使用var关键字声明可变属性,或者用val关键字声明只读属性,属性的类型在后面,变量名在前面,中间加冒号和空格. public class Address ...

  6. Android 基础UI组件(一)

    1.Toast //显示文字 Toast.makeText(this,"Toast显示文本",Toast.LENGTH_SHORT).show(); //显示图片 Toast to ...

  7. spring boot druid数据源

    pom.xml配置 <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <art ...

  8. 【C/C++】小红的字符串 / 中兴捧月

    考试的时候想复杂了,其实直接一边写放进set里去重就可以了 很有意思 自己的理解就是cpp的map+set或者就是set可以完成大多数java的hashset操作 链接:https://ac.nowc ...

  9. 漏洞扫描器-AWVS

    目录 介绍 漏洞扫描 网络爬虫==漏洞分析.验证 主机发现 子域名探测 SQL注入 HTTP头编辑 HTTP监听 介绍 AWVS为Acunetix Web Vulnarability Scanner的 ...

  10. 关于使用Topshelf创建服务

    目录 0. 背景说明 1. 使用Topshelf组件创建Windows服务 1.1 依赖Quartz.net实现定时任务 1.2 依赖于Topshelf创建服务类 1.3 log4net的配置文件lo ...