题意:给一棵nnn个点的无权树和xxx,qqq次询问,每次给定一个点集SSS,询问从xxx开始每次随机走一步,SSS中的每个点至少被经过一次的期望步数。

n≤18,q≤5000n\leq 18,q\leq 5000n≤18,q≤5000

题目求的相当于是SSS中的所有点 第一次被访问的时间 的最大值 的期望,发现nnn很小,可以Min-Max容斥成第一次到SSS 中任意一个点的期望时间。

然后考虑 dp。设xxx为根,fuf_ufu​表示从uuu开始到SSS中任意一个点的期望时间。

fu=1degu(ffau+∑v∈sonufv)+1f_u=\frac{1}{deg_u}(f_{fa_u}+\sum _{v\in son_u}f_v)+1fu​=degu​1​(ffau​​+v∈sonu​∑​fv​)+1

degu⋅fu=ffau+∑v∈sonufv+degudeg_u\cdot f_u=f_{fa_u}+\sum _{v\in son_u}f_v+deg_udegu​⋅fu​=ffau​​+v∈sonu​∑​fv​+degu​

一个套路,待定系数法设fu=kuffau+buf_u=k_uf_{fa_u}+b_ufu​=ku​ffau​​+bu​

degu⋅fu=ffau+∑v∈sonu(kvfu+bv)+degudeg_u\cdot f_u=f_{fa_u}+\sum _{v\in son_u}(k_vf_u+b_v)+deg_udegu​⋅fu​=ffau​​+v∈sonu​∑​(kv​fu​+bv​)+degu​

(degu−∑kv+1)⋅fu=ffau+∑bv+degu(deg_u-\sum k_v+1)\cdot f_u=f_{fa_u}+\sum b_v+deg_u(degu​−∑kv​+1)⋅fu​=ffau​​+∑bv​+degu​

解得

kv=1degu−∑kv+1k_v=\frac{1}{deg_u-\sum k_v+1}kv​=degu​−∑kv​+11​

bv=∑bv+degudegu−∑kv+1b_v=\frac{\sum b_v+deg_u}{deg_u-\sum k_v+1}bv​=degu​−∑kv​+1∑bv​+degu​​

如果u∈Su\in Su∈S,有fu=0f_u=0fu​=0,对它的父亲没有贡献,直接ku=bu=0k_u=b_u=0ku​=bu​=0

SSS的答案就是fx=bxf_x=b_xfx​=bx​,乘上容斥系数再FWT一下就可以快速回答询问

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
using namespace std;
const int MOD=998244353;
typedef long long ll;
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD,p>>=1;}return ans;
}
#define inv(x) qpow(x,MOD-2)
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
int k[20],b[20];
vector<int> e[20];
void dfs(int u,int f,int S)
{if (S&(1<<u)) return (void)(k[u]=b[u]=0);int sumk=0,sumb=0;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=f)dfs(e[u][i],u,S),sumk=add(sumk,k[e[u][i]]),sumb=add(sumb,b[e[u][i]]);k[u]=inv(dec((int)e[u].size(),sumk)),b[u]=((ll)e[u].size()+sumb)*k[u]%MOD;
}
int f[1<<20];
int main()
{int n,q,x;scanf("%d%d%d",&n,&q,&x);for (int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);e[u].push_back(v),e[v].push_back(u);}for (int S=1;S<(1<<n);S++){dfs(x,0,S<<1);f[S]=b[x];int c=0;for (int i=0;i<n;i++) c^=(S>>i)&1;if (!c) f[S]=dec(0,f[S]);}for (int l=0;l<n;l++){int mid=1<<l,len=mid<<1;for (int s=0;s<(1<<n);s+=len)for (int k=0;k<mid;k++)f[s+mid+k]=add(f[s+mid+k],f[s+k]);}while (q--){int S=0;int k;scanf("%d",&k);for (int i=1;i<=k;i++){int x;scanf("%d",&x);S|=1<<x;}printf("%d\n",f[S>>1]);}return 0;
}

【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】相关推荐

  1. P5643-[PKUWC2018]随机游走【min-max容斥,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5643 题目大意 给出nnn个点的一棵树,一个人从点xxx开始随机游走,然后QQQ次询问给出一个点集SSS,求期望 ...

  2. loj#2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    loj#2542 [PKUWC2018]随机游走 (概率期望.组合数学.子集和变换.Min-Max容斥) 很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题 ...

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

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

  4. LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...

  5. loj 2542 随机游走 —— 最值反演+树上期望DP+fmt

    题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...

  6. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  7. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  8. 「PKUWC2018」随机游走

    Min-Max容斥真好用 LOJ #2542 题意:给一棵不超过1818个节点的树,50005000次询问,每次问从根随机游走走遍一个集合的期望步数 Solution: 考虑Min-Max容斥 有Ma ...

  9. 最值反演[PKUWC2018][loj2542]随机游走

    前言 这是学习容斥过程中的一个比较裸的题了 题意简介 题目链接 题目大意 给出一棵nnn个点的树,给出树上的一个点xxx 现在进行QQQ次询问,每次询问一个点集,求从xxx点开始进行随机随机游走,第一 ...

最新文章

  1. 最新手机号段归属地数据库(2017年4月16日版)免费下载
  2. mybaits二十八:逆向工程
  3. js寻找两个数组的差集_js求两个数组的交集|并集|差集|去重
  4. Redis之慢查询分析
  5. samba 服务器搭建
  6. XHTML下css+div编写
  7. excel不使用科学计数法
  8. @RequestParam使用
  9. ECMAScript 简介
  10. ORDER BY用法,避坑
  11. 丙烯酰胺php泥浆,大桥钻孔灌注桩清孔施工方法
  12. Kubesphere流水线集成(Git、Maven、Docker、K8S)
  13. c++析构函数的调用
  14. SSD固态硬盘优化方案,让新买的SSD速度不再慢
  15. 齐向东透露工信部检测360浏览器
  16. yarn computed integrity doesn‘t match our records 错误
  17. WPS Excel 作图的一些小技巧
  18. 高级商务办公软件应用【7】
  19. python 加密解密 rc4_python实现rc4加密解密,base64输出
  20. c语言shengchen图像,430编程C语言常识(IAR)(二)结构体与联合体

热门文章

  1. 世界各国的教育差距有多大?这几部全世界都在热议的教育纪录片,揭开一切.........
  2. 史上四大“杀人”建筑,烧掉几百亿,却犯低级错误,网友:有钱人的智商,我不懂
  3. clickhouse建库_ClickHouse高性能数据库
  4. asp.net添加删除表格_如何用openpyxl自动化编写Excel电子表格
  5. 涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!
  6. php windows共享内存,关于php的共享内存的使用和研究之由起
  7. leetcode——242. 有效的字母异位词
  8. [Redis6]新数据类型_Geospatial
  9. Java源文件声明规则
  10. 关于-32768补码的问题