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. Yarn 容量调度器多队列提交案例

    目录 Yarn 容量调度器多队列提交案例 需求 配置多队列的容量调度器 1 修改如下配置 SecureCRT的上传和下载 2 上传到集群并分发 3 重启Yarn或yarn rmadmin -refre ...

  2. HTML5 基础内容(元素/属性/格式化)

    HTML基础 1.HTML元素 1.1 元素指的是开始标签到结束标签的所有代码. 1.2 元素的内容是开始标签与结束标签之间的内容. 1.3大多数HTML元素可用有属性. 1.4标签可以拥有属性为元素 ...

  3. ybatis中查询出多个以key,value的属性记录,封装成一个map返回的方法

    可以采用值做映射,也可以不采用映射方式 <resultMap id="configMap" type="java.util.Map" > <r ...

  4. Xcode功能快捷键

    隐藏xcode command+h退出xcode command+q关闭窗口 command+w关闭所有窗口 command+option+w关闭当前项目 command+control+w关闭当前文 ...

  5. MFC入门示例之列表框(CListControl)

    初始化: 1 //初始化列表 2 m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //报表样式 3 m_list.InsertColumn(0, TEXT( ...

  6. 三维引擎导入obj模型不可见总结

    最近有客户试用我们的三维平台,在导入模型的时候,会出现模型全黑和不可见的情况.上一篇文章说了全黑的情况.此文说下不可见的情况. 经过测试,发现可能有如下两种情况. 导入的模型不在镜头视野内 导入的模型 ...

  7. Docker从入门到精通(五)——Dockerfile

    Dockerfile 简单来说就是一个包含用于组合镜像的命令的文本文档,Docker 通过读取 Dockerfile 中的指令就可以按步骤生成镜像,那么在制作镜像之前,我们先了解一下镜像的原理. 1. ...

  8. Shell if 参数含义列表

    [ -a FILE ]  如果 FILE 存在则为真.   [ -b FILE ]  如果 FILE 存在且是一个块特殊文件则为真.   [ -c FILE ]  如果 FILE 存在且是一个字特殊文 ...

  9. JUC之Lock接口以及Synchronized回顾

    Lock接口 Synchronized关键字回顾: 多线程编程步骤(上): 创建资源类,在资源类创建属性和操作方法 创建多个线程,调用资源类的操作方法 创建线程的四种方式: 继承Thread 实现Ru ...

  10. 在React中使用 react-router-dom 编程式路由导航的正确姿势【含V5.x、V6.x】

    ## react-router-dom 编程式路由导航 (v5) ###### 1.push跳转+携带params参数 ```jsx props.history.push(`/b/child1/${i ...