传送门

  • 这种求 “取到所有物品的期望时间” 的题一般都用 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​=PT​1​
    设有覆盖到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)相关推荐

  1. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  2. uoj#422. 【集训队作业2018】小Z的礼物

    uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...

  3. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  4. UOJ#449. 【集训队作业2018】喂鸽子

    #449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...

  5. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  6. UOJ#422 小Z的礼物

    非常神奇的一个套路......首先min-max容斥一波,变成枚举子集然后求所有子集min的期望. 一个子集的期望怎么求?我们可以求出所有的r = 2nm - n - m个选法中能够选到这个子集的方案 ...

  7. ZZULIOJ 2853: 小A的游戏昵称(容斥定理)

    2853: 小A的游戏昵称 简单的容斥定理考察 加上3,5,7的倍数,减去,15,21,35的倍数,再加上105的倍数, 就可以得到结果 #include<iostream> using ...

  8. uoj#448. 【集训队作业2018】人类的本质(Min_25筛+拉格朗日插值)

    题面 传送门 题解 肝了整整一天--膜拜yww和cx巨巨--(虽然它们的题解里我就没看懂几个字) 请备好草稿纸和笔,这种题目就是需要耐心推倒 题目所求是这么一个东西 \[ \begin{aligned ...

  9. 【集训队作业2018】围绕着我们的圆环

    我貌似开始爆OJ了 主要是因为预处理的范围写小,以及第一次写带删除线性基,然后就调了好久/cy 如果把 \(A\) 看做一堆列向量,然后对于 \(C\) 的一个列向量 \(V\) ,以及对应列的 \( ...

最新文章

  1. DOS循环:bat/批处理for命令详解之一 (史上虽详尽的总结和说明~~)
  2. oracle 27504,ora-27504 ora-27300 ora-27301 ora-27302
  3. Linux Kernel中local_irq_enable()和local_irq_disable()的实现
  4. Introspection
  5. service-mesh
  6. 33tomcat目录结构
  7. epoll示例程序——客户端
  8. hadoop3.1.0集群搭建
  9. 在linux vi中激活鼠标中键,实现滚动换行
  10. DotNetNuke(DNN)皮肤制作--如何修改DNN中众多的CSS文件
  11. 禁用Win10驱动程序强制签名验证
  12. 《ROS理论与实践》学习笔记(七)机器人语音交互
  13. SSL 1203 书的复制
  14. 千树万树梨花开:二叉树的实现以及存储结构
  15. [半监督学习] In Defense of Pseudo-Labeling: An Uncertainty-Aware Pseudo-label Selection Framework for SSL
  16. mybatis-generator工具生成对应的自定Service和Controller
  17. All the Vowels Please
  18. 浅谈前端SPA(单页面应用)
  19. BIM设计要做哪些准备工作才能真正完成建筑全生命周期的使命
  20. python api讲解_集合api讲解_Python C编程视频课程_Python视频-51CTO学院

热门文章

  1. 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
  2. 临界表储存图的数据(思路+详解+图示)
  3. 7-45 航空公司VIP客户查询 (25 分)(思路+详解+map用法解释+超时解决)兄弟们来呀冲压呀呀呀呀
  4. C++ class实现顺序栈(完整代码)
  5. [蓝桥杯][基础练习VIP]Huffuman树
  6. 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
  7. linux 进程内存开销,linux下查看最消耗CPU、内存的进程
  8. cg word List5
  9. 数据结构---二叉线索树
  10. Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树