正题

题目链接:https://www.luogu.com.cn/problem/AT4119


题目大意

一个集合\(S=\{k\in[1,n]\cup N\}\),它的所有子集作为元素组成的集合中要求满足每一个数字的出现之和不小于\(2\),求方案数对\(P\)取模。

\(1\leq n\leq 3000,P\in[10^8,10^{9}+9]\cup Pri\)


解题思路

考虑至少\(i\)个数选择次数不超过\(1\),那么这个方案的容斥系数就是\((-1)^i\)。

考虑怎么求这个方案,我们可以先不要被限制了的数,然后再将这些被限制了的数丢进被选出了的集合中。设有\(j\)个集合包含被限制了的数,那么丢进这些集合的方案就是\(\begin{Bmatrix} i+1\\j+1 \end{Bmatrix}\)(一个数字可以选择不丢所以开一个新的集合表示这个集合内的数不使用),然后剩下的数随意的选入这些集合中就是\((2^{n-i})^j\)。

那么答案出来了

\[\sum_{i=0}^n(-1)^i2^{2^{n-i}}\binom{n}{i}\sum_{j=0}^i\begin{Bmatrix}i+1\\ j+1\end{Bmatrix}(2^{n-i})^j
\]

直接预处理斯特林数计算就好了,时间复杂度\(O(n^2)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=3100;
ll n,P,s[N][N],fac[N],ans;
ll power(ll x,ll b,ll p=P){
ll ans=1;
while(b){
if(b&1)ans=ans*x%p;
x=x*x%p;b>>=1;
}
return ans;
}
ll C(ll n,ll m)
{return fac[n]*power(fac[m],P-2)%P*power(fac[n-m],P-2)%P;}
signed main()
{
scanf("%lld%lld",&n,&P);s[0][0]=fac[0]=1;
for(ll i=1;i<=n;i++)fac[i]=fac[i-1]*i%P;
for(ll i=1;i<=n+1;i++)
for(ll j=1;j<=i;j++)
s[i][j]=(s[i-1][j-1]+j*s[i-1][j]%P)%P;
for(ll i=0;i<=n;i++){
ll sum=0,tmp=power(2,power(2,n-i,P-1));
if(i&1)tmp=P-tmp;tmp=tmp*C(n,i)%P;
for(ll j=0,z=1,p=power(2,n-i);j<=i;j++,z=z*p%P)
(sum+=s[i+1][j+1]*z%P)%=P;
(ans+=sum*tmp)%=P;
}
printf("%lld\n",ans);
return 0;
}

AT4119-[ARC096C]Everything on It【斯特林数,容斥】的更多相关文章

  1. [FJOI2017]矩阵填数——容斥

    参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...

  2. (noip模拟十七)【BZOJ3930】[CQOI2015]选数-容斥水法

    Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...

  3. BZOJ 2287 DP+容斥

    思路: 先处理出来f[j]表示这i个物品都可用 填满容量j的方案数 容斥一发 处理出来g[j]=g[j-w[i]] 表示i不能用的时候 填满容量j的方案数 //By SiriusRen #includ ...

  4. 【CF715E】Complete the Permutations(容斥,第一类斯特林数)

    [CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...

  5. ARC096 E Everything on It [容斥,斯特林数]

    Atcoder 一个900分的题耗了我这么久--而且官方题解还那么短--必须纪念一下-- 思路 发现每种元素必须出现两次以上的限制极为恶心,所以容斥,枚举出现0/1次的元素个数分别有几个.设出现1次的 ...

  6. BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)

    题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...

  7. BZOJ 4555: [Tjoi2016&Heoi2016]求和 (NTT + 第二类斯特林数)

    题意 给你一个数 \(n\) 求这样一个函数的值 : \[\displaystyle f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i} \begin{Bmatrix} i \\ j ...

  8. 【CF961G】Partitions(第二类斯特林数)

    [CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...

  9. BZOJ.4555.[HEOI2016&TJOI2016]求和(NTT 斯特林数)

    题目链接 \(Description\) 求\[\sum_{i=0}^n\sum_{j=0}^iS(i,j)\times 2^j\times j!\mod 998244353\] 其中\(S(i,j) ...

随机推荐

  1. 解析一个HTML字符串

    存在问题 来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它.怎么办?jsonu能够帮你轻松解决这些问题 解决方法 使用静态Jsoup ...

  2. Html 之自动高度 auto 和 100%高度

    HTML 高度 下面示例 设置为 Auto 和 100% <!DOCTYPE html> <html lang="en"> <head> < ...

  3. 自旋锁&信号量

    1. 自旋锁 Linux内核中最常见的锁是自旋锁.一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁".如果锁可用,则"锁定"位被 ...

  4. HTTP状态码:3XX

    3XX状态码 含义:表明浏览器需要执行某些特殊的处理以正确的处理请求,大部分都需要进行重定向.这类状态码代表需要客户端采取进一步的操作才能完成请求.通常,这些状态码用来重定向,后续的请求地址(重定向目 ...

  5. linux》centos6.1.环境下发送邮件设置

    转自https://blog.csdn.net/bodybo/article/details/80817968 一. Sendmail安装 在CentOS下,sendmail一般默认是随操作系统一起安 ...

  6. LeetCode入门指南 之 动态规划思想

    推荐学习labuladong大佬的动态规划系列文章:先弄明白什么是动态规划即可,不必一次看完.接着尝试自己做,没有思路了再回过头看相应的文章. 动态规划一般可以由 递归 + 备忘录 一步步转换而来,不 ...

  7. Linux centos7 scp命令

    1. 命令简介 scp(secure copy) 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令,可以在两台 Linux 主机进行复制操作 # 语法 scp [-1246BCpqr ...

  8. Photoshop 批量修改图像大小

  9. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

  10. Python入门学习之:10分钟1500访问量

    看效果: 不扯没用的,直接上代码: # author : sunzd # date : 2019/9/01 # position : beijing from fake_useragent impor ...