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. JVM1 JVM与Java体系结构

    目录 JVM与Java体系结构 虚拟机与Java虚拟机 虚拟机 Java虚拟机 JVM的位置 JVM的整体结构 Java代码执行流程 JVM的架构模型 基于栈的指令级架构 基于寄存器的指令级架构 两种 ...

  2. A Child's History of England.40

    Excommunication was, next to the Interdict I told you of at the close {end} of the last chapter, the ...

  3. 零基础学习java------day19-------定时器,线程面试题,Udp,Tcp

    0. 定时器  0.1 概述: 定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行,在jaa中,可以通过Timew和TimerTask类来实现定义调度的功能 0.2 Tim ...

  4. webpack打包报错 ERROR in ./js/ww.js from UglifyJs Unexpected token keyword «function», expected punc «,» [src/page/ww/view/xx/xx.vue:119,0][./js/ww.js:55218,17]

    找了好多解决办法 你可以试着将babel-loader的exclude注释掉,然后看能否打包成功.如果可以,那就是这个问题.你只需要在vue.config.js中配置transpileDependen ...

  5. 【Git项目管理】Git分支 - 远程分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等. 你可以通过 git ls-remote (remote) 来显式地获得远程引用的完整列表,或者通过 git remote show ...

  6. JavaIO——转换流、字符编码

    1.转换流 转换流是将字节流变成字符流的流. OutputStreamWriter:将字节输出流转换成字符输出流. public class OutputStreamWriter extends Wr ...

  7. OSGI与Spring结合开发web工程

    简介: 作为一个新的事实上的工业标准,OSGi 已经受到了广泛的关注, 其面向服务(接口)的基本思想和动态模块部署的能力, 是企业级应用长期以来一直追求的目标.Spring 是一个著名的 轻量级 J2 ...

  8. 【阿菜做实践】利用ganache-cli本地fork以太坊主链分叉

    前言 Fork主网意思是模拟具有与主网相同的状态的网络,但它将作为本地开发网络工作. 这样你就可以与部署的协议进行交互,并在本地测试复杂的交互.不用担心分叉主网作为测试链会占很多内存.这些方法都不会将 ...

  9. 12月第二周bug总结

    1.bug总结 复制 别人的依赖和依赖指定类型 报错 解决:依赖还没加载完成,你就指定了版本型号,所以报错,所以先让他加载依赖,后指定该型号 eureka(优瑞卡) 注册服务 控制台没有显示出来的话 ...

  10. Nginx区分内部与外部

    目录 一.简介 二.配置 一.简介 场景: 当网站需要维护时,访问任何连接都显示维护页面 原理: 将任何访问都重定向到维护页面. 二.配置 server { listen 80; index inde ...