正题

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


题目大意

给出nnn个点的一棵树,一个人从点xxx开始随机游走,然后QQQ次询问给出一个点集SSS,求期望多少步这个人会经过这个点集中的所有点。

1≤n≤18,1≤Q≤50001\leq n\leq 18,1\leq Q\leq 50001≤n≤18,1≤Q≤5000


解题思路

整个点集都走完比较难统计,我们可以考虑用min−maxmin-maxmin−max容斥转为求走到其中一个点的期望步数。

我们设我们目前枚举的集合是SSS,那么首先有fx=0(x∈S)f_x=0(x\in S)fx​=0(x∈S)

然后有转移方程:
fx=1degx(ffax+∑x→yfy)f_{x}=\frac{1}{deg_x}(f_{fa_x}+\sum_{x\rightarrow y}f_{y})fx​=degx​1​(ffax​​+x→y∑​fy​)
惯例的我们设fx=Axffax+Bxf_x=A_xf_{fa_x}+B_xfx​=Ax​ffax​​+Bx​
fx=1degx(ffax+∑x→y(Ayfx+By))f_{x}=\frac{1}{deg_x}\left(f_{fa_x}+\sum_{x\rightarrow y}(A_yf_x+B_y)\right)fx​=degx​1​(ffax​​+x→y∑​(Ay​fx​+By​))
fx=1degxffax+sumAfxdeg+1degxsumB+1f_{x}=\frac{1}{deg_x}f_{fa_x}+\frac{sumAf_x}{deg}+\frac{1}{deg_x}sumB+1fx​=degx​1​ffax​​+degsumAfx​​+degx​1​sumB+1
degx−sumAdegxfx=1degxffax+1degxsumB+1\frac{deg_x-sumA}{deg_x}f_x=\frac{1}{deg_x}f_{fa_x}+\frac{1}{deg_x}sumB+1degx​degx​−sumA​fx​=degx​1​ffax​​+degx​1​sumB+1
fx=1degx−sumAffax+degx+sumBdegx−sumAf_x=\frac{1}{deg_x-sumA}f_{fa_x}+\frac{deg_x+sumB}{deg_x-sum_A}fx​=degx​−sumA1​ffax​​+degx​−sumA​degx​+sumB​

这样我们就可以推出AAA和BBB,而BxB_xBx​就是节点xxx的fff值,记gS=Bxg_S=B_xgS​=Bx​。

那么根据min-max容斥如果我们询问集合SSS时答案就是
∑T⊆S(−1)∣T∣+1gT\sum_{T\sube S}(-1)^{|T|+1}g_TT⊆S∑​(−1)∣T∣+1gT​

用个高维前缀和就可以预处理所有集合的答案了。

时间复杂度:O(n2nlog⁡P)O(n2^n\log P)O(n2nlogP)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=18,P=998244353;
struct node{ll to,next;
}a[N<<1];
ll n,Q,rt,tot,ls[N],deg[N];
ll A[N],B[N],c[1<<N],f[1<<N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;deg[y]++;return;
}
void dfs(ll x,ll fa,ll S){ll sumA=0,sumB=0;if((S>>x)&1){A[x]=B[x]=0;return;}for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dfs(y,x,S);sumA=(sumA+A[y])%P;sumB=(sumB+B[y])%P;}ll inv=power((deg[x]-sumA+P)%P,P-2);A[x]=inv;B[x]=(deg[x]+sumB)*inv%P;return;
}
signed main()
{scanf("%lld%lld%lld",&n,&Q,&rt);rt--;for(ll i=1,x,y;i<n;i++){scanf("%lld%lld",&x,&y);x--;y--;addl(x,y);addl(y,x);}ll MS=(1<<n);for(ll s=1;s<MS;s++){memset(A,0,sizeof(A));memset(B,0,sizeof(B));dfs(rt,n,s);f[s]=B[rt];}for(ll s=1;s<MS;s++){c[s]=c[s-(s&-s)]+1;f[s]=((c[s]&1)?f[s]:(P-f[s]));}for(ll i=0;i<n;i++)for(ll s=MS-1;s>=0;s--)if((s>>i)&1)(f[s]+=f[s-(1<<i)])%=P;while(Q--){ll k,s=0;scanf("%lld",&k);for(ll i=0,x;i<k;i++)scanf("%lld",&x),s|=(1<<x-1);printf("%lld\n",f[s]);}return 0;
}

P5643-[PKUWC2018]随机游走【min-max容斥,dp】相关推荐

  1. 【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】

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

  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. 「PKUWC2018」随机游走

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

  6. 「PKUWC2018」随机游走

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

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

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

  8. UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time

    UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time 这一讲介绍可选停时(optional stopping),我们先回顾一下停时的定义: ...

  9. python游走代码_介绍一个全局最优化的方法:随机游走算法(Random Walk)

    1. 关于全局最优化求解 全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高的情 ...

最新文章

  1. python数组对应元素相乘_python的几种矩阵相乘的公式详解
  2. oracle中导入导出数据备份数据库
  3. C# 发邮件类可发送附件
  4. es5直接引入html文件,ES6+转ES5(webpack+babel、指定多个js文件、自动注入)
  5. mybatis高级查询,批量新增
  6. Java不是true值不变_Java语言中String a=a;String b=a; 为什么 a==b 值为 true?
  7. c语言程序设计指针教学,C语言程序设计中指针教学要点分析
  8. Python迭代对象、迭代器、生成器
  9. 2013-8-9练习[多种方法制作一个计时器]
  10. 类型转换和页面获取值(总爱忘的)
  11. Dynamica AX2012 Tmp Table or Form 获取数据
  12. 数据结构----二路归并排序
  13. 学计算机ppt感想60字,ppt制作的体会和感受
  14. GoAhead学习之GoForms
  15. MATLAB 使用 loglog semilogy 不显示对数坐标
  16. 腾讯云云服务器迁移服务相关问题
  17. matlab 矩阵白化,主成分分析中如何对矩阵进行白化处理
  18. Opencv 轮廓提取
  19. tomcat部署静态html网站方法
  20. signature=ac75cb7977a45c0f7d8a73dca59a4c27,合肥2016年8月24日至2016年9月5日交通违章查询...

热门文章

  1. 《SAS编程与数据挖掘商业案例》学习笔记之十
  2. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf
  3. linux 内核 三天吐血,编译安装——吐血经验,内附脚本
  4. arm cpu 超频_树莓派 400 超频方法介绍
  5. php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云
  6. python递归函数查询表_python---------------递归函数
  7. char截取字符串_字符串的排列(滑动窗口)
  8. 数据结构——最短路径算法之floyd算法
  9. 455. 分发饼干001(贪心算法+详解)
  10. [SpringSecurity]web权限方案_用户认证_设置用户名密码