P5643-[PKUWC2018]随机游走【min-max容斥,dp】
正题
题目链接: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=degx1(ffax+x→y∑fy)
惯例的我们设fx=Axffax+Bxf_x=A_xf_{fa_x}+B_xfx=Axffax+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=degx1(ffax+x→y∑(Ayfx+By))
fx=1degxffax+sumAfxdeg+1degxsumB+1f_{x}=\frac{1}{deg_x}f_{fa_x}+\frac{sumAf_x}{deg}+\frac{1}{deg_x}sumB+1fx=degx1ffax+degsumAfx+degx1sumB+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+1degxdegx−sumAfx=degx1ffax+degx1sumB+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−sumA1ffax+degx−sumAdegx+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(n2nlogP)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】相关推荐
- 【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】
题意:给一棵nnn个点的无权树和xxx,qqq次询问,每次给定一个点集SSS,询问从xxx开始每次随机走一步,SSS中的每个点至少被经过一次的期望步数. n≤18,q≤5000n\leq 18,q\l ...
- loj#2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
loj#2542 [PKUWC2018]随机游走 (概率期望.组合数学.子集和变换.Min-Max容斥) 很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题 ...
- P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...
- LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...
- LOJ#2542. 「PKUWC2018」随机游走
LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...
- 「PKUWC2018」随机游走
Min-Max容斥真好用 LOJ #2542 题意:给一棵不超过1818个节点的树,50005000次询问,每次问从根随机游走走遍一个集合的期望步数 Solution: 考虑Min-Max容斥 有Ma ...
- 最值反演[PKUWC2018][loj2542]随机游走
前言 这是学习容斥过程中的一个比较裸的题了 题意简介 题目链接 题目大意 给出一棵nnn个点的树,给出树上的一个点xxx 现在进行QQQ次询问,每次询问一个点集,求从xxx点开始进行随机随机游走,第一 ...
- UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time
UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time 这一讲介绍可选停时(optional stopping),我们先回顾一下停时的定义: ...
- python游走代码_介绍一个全局最优化的方法:随机游走算法(Random Walk)
1. 关于全局最优化求解 全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高的情 ...
最新文章
- python数组对应元素相乘_python的几种矩阵相乘的公式详解
- oracle中导入导出数据备份数据库
- C# 发邮件类可发送附件
- es5直接引入html文件,ES6+转ES5(webpack+babel、指定多个js文件、自动注入)
- mybatis高级查询,批量新增
- Java不是true值不变_Java语言中String a=a;String b=a; 为什么 a==b 值为 true?
- c语言程序设计指针教学,C语言程序设计中指针教学要点分析
- Python迭代对象、迭代器、生成器
- 2013-8-9练习[多种方法制作一个计时器]
- 类型转换和页面获取值(总爱忘的)
- Dynamica AX2012 Tmp Table or Form 获取数据
- 数据结构----二路归并排序
- 学计算机ppt感想60字,ppt制作的体会和感受
- GoAhead学习之GoForms
- MATLAB 使用 loglog semilogy 不显示对数坐标
- 腾讯云云服务器迁移服务相关问题
- matlab 矩阵白化,主成分分析中如何对矩阵进行白化处理
- Opencv 轮廓提取
- tomcat部署静态html网站方法
- signature=ac75cb7977a45c0f7d8a73dca59a4c27,合肥2016年8月24日至2016年9月5日交通违章查询...
热门文章
- 《SAS编程与数据挖掘商业案例》学习笔记之十
- stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf
- linux 内核 三天吐血,编译安装——吐血经验,内附脚本
- arm cpu 超频_树莓派 400 超频方法介绍
- php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云
- python递归函数查询表_python---------------递归函数
- char截取字符串_字符串的排列(滑动窗口)
- 数据结构——最短路径算法之floyd算法
- 455. 分发饼干001(贪心算法+详解)
- [SpringSecurity]web权限方案_用户认证_设置用户名密码