[集训队作业2018]小Z的礼物(min-max容斥,插头dp)
传送门
这种求 “取到所有物品的期望时间” 的题一般都用 min−maxmin-maxmin−max容斥 解决:
设t(i,j)t(i,j)t(i,j)为取到格子(i,j)(i,j)(i,j)的期望时间,集合S=∪c(i,j)=′∗′{t(i,j)}S=\cup_{c(i,j)='*'}\{t(i,j)\}S=∪c(i,j)=′∗′{t(i,j)}
那么根据min−maxmin-maxmin−max容斥有:max(S)=∑T⊆S,T≠∅(−1)∣T∣−1min(T)\max(S) = \sum_{T\subseteq S, T \neq \varnothing} (-1)^{|T|-1}\min(T)max(S)=T⊆S,T=∅∑(−1)∣T∣−1min(T)min(T)min(T)min(T)即为首次取到TTT中的格子的期望时间(记为ETE_TET),考虑转成求概率:
设PTP_{T}PT为取到TTT中的格子的概率,由ET=1+(1−PT)ETE_{T}=1+(1-P_T)E_TET=1+(1−PT)ET解得ET=1PTE_T=\frac{1}{P_T}ET=PT1
设有覆盖到TTT中的格子的相邻对个数为xxx,因为总共的相邻对个数为m(n−1)+n(m−1)m(n-1)+n(m-1)m(n−1)+n(m−1),所以PT=xm(n−1)+n(m−1)P_T=\frac{x}{m(n-1)+n(m-1)}PT=m(n−1)+n(m−1)x,得到ET=m(n−1)+n(m−1)xE_T=\frac{m(n-1)+n(m-1)}{x}ET=xm(n−1)+n(m−1)发现子集TTT数量很多,但是xxx非常小,于是神奇地转换思路:
求出对于每个xxx,有多少个子集TTT满足恰有xxx个相邻对有覆盖到TTT中的点。
上插头dp,设dp[i][j][s][x]dp[i][j][s][x]dp[i][j][s][x]表示做到了(i,j)(i,j)(i,j),当前状态为sss,有xxx个相邻对。
我们dp的内容是系数和,如果选了一个格子,集合大小改变,要乘一个−1-1−1作为系数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=998244353;
int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
int dec(int a,int b){return a<b?a-b+mod:a-b;}
int mul(int a,int b){return 1ll*a*b%mod;}
void Add(int &a,int b){a=add(a,b);}
int ksm(int a,int b){int res=1;while(b){if(b&1) res=mul(res,a);b>>=1;a=mul(a,a);}return res;
}
int n,m;
char c[10][110];
int dp[2][1<<6][1250],ans;//N*M*2=1200
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",c[i]+1);int tot=n*(m-1)+m*(n-1);int cur=1,pre=0;dp[cur][0][0]=dec(0,1);int sta=(1<<n)-1;for(int i=1;i<=m;++i){for(int j=1;j<=n;++j){swap(cur,pre);memset(dp[cur],0,sizeof(dp[cur]));for(int s=0;s<=sta;s++){for(int k=0;k<=tot;k++){if(dp[pre][s][k]){int ss=s&(sta^(1<<(j-1)));Add(dp[cur][ss][k],dp[pre][s][k]);if(c[j][i]=='*'){ss|=(1<<j-1);int delta=(i!=1&&(s&(1<<j-1))==0)+(j!=1&&(s&(1<<j-2))==0)+(i<m)+(j<n);Add(dp[cur][ss][k+delta],dec(0,dp[pre][s][k]));}}}}}}for(int i=1;i<=tot;i++){ll inv=ksm(i,mod-2);for(int s=0;s<=sta;s++)Add(ans,mul(dp[cur][s][i],inv));}ans=mul(ans,tot);cout<<ans;return 0;
}
参考文章:
https://www.cnblogs.com/ZH-comld/p/11014880.html
https://www.cnblogs.com/huyufeifei/p/10498429.html
[集训队作业2018]小Z的礼物(min-max容斥,插头dp)相关推荐
- P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...
- uoj#422. 【集训队作业2018】小Z的礼物
uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- UOJ#449. 【集训队作业2018】喂鸽子
#449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- UOJ#422 小Z的礼物
非常神奇的一个套路......首先min-max容斥一波,变成枚举子集然后求所有子集min的期望. 一个子集的期望怎么求?我们可以求出所有的r = 2nm - n - m个选法中能够选到这个子集的方案 ...
- ZZULIOJ 2853: 小A的游戏昵称(容斥定理)
2853: 小A的游戏昵称 简单的容斥定理考察 加上3,5,7的倍数,减去,15,21,35的倍数,再加上105的倍数, 就可以得到结果 #include<iostream> using ...
- uoj#448. 【集训队作业2018】人类的本质(Min_25筛+拉格朗日插值)
题面 传送门 题解 肝了整整一天--膜拜yww和cx巨巨--(虽然它们的题解里我就没看懂几个字) 请备好草稿纸和笔,这种题目就是需要耐心推倒 题目所求是这么一个东西 \[ \begin{aligned ...
- 【集训队作业2018】围绕着我们的圆环
我貌似开始爆OJ了 主要是因为预处理的范围写小,以及第一次写带删除线性基,然后就调了好久/cy 如果把 \(A\) 看做一堆列向量,然后对于 \(C\) 的一个列向量 \(V\) ,以及对应列的 \( ...
最新文章
- DOS循环:bat/批处理for命令详解之一 (史上虽详尽的总结和说明~~)
- oracle 27504,ora-27504 ora-27300 ora-27301 ora-27302
- Linux Kernel中local_irq_enable()和local_irq_disable()的实现
- Introspection
- service-mesh
- 33tomcat目录结构
- epoll示例程序——客户端
- hadoop3.1.0集群搭建
- 在linux vi中激活鼠标中键,实现滚动换行
- DotNetNuke(DNN)皮肤制作--如何修改DNN中众多的CSS文件
- 禁用Win10驱动程序强制签名验证
- 《ROS理论与实践》学习笔记(七)机器人语音交互
- SSL 1203 书的复制
- 千树万树梨花开:二叉树的实现以及存储结构
- [半监督学习] In Defense of Pseudo-Labeling: An Uncertainty-Aware Pseudo-label Selection Framework for SSL
- mybatis-generator工具生成对应的自定Service和Controller
- All the Vowels Please
- 浅谈前端SPA(单页面应用)
- BIM设计要做哪些准备工作才能真正完成建筑全生命周期的使命
- python api讲解_集合api讲解_Python C编程视频课程_Python视频-51CTO学院
热门文章
- 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
- 临界表储存图的数据(思路+详解+图示)
- 7-45 航空公司VIP客户查询 (25 分)(思路+详解+map用法解释+超时解决)兄弟们来呀冲压呀呀呀呀
- C++ class实现顺序栈(完整代码)
- [蓝桥杯][基础练习VIP]Huffuman树
- 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
- linux 进程内存开销,linux下查看最消耗CPU、内存的进程
- cg word List5
- 数据结构---二叉线索树
- Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树