题意

给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去。

有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一直随机游走,直到点集 \(S\) 中所有点都至少经过一次的话,期望游走几步。

\(1\leq n\leq 18\),\(1\leq Q\leq 5000\) .

Solution

题意即为求集合中最后一个点被访问的期望时间。考虑 \(\text{min-max}\) 容斥,转化为第一个点被访问的期望时间 \(E(\min(S))\)

\(2^n\) 枚举所有子集 \(S\) ,设 \(f(u)\) 表示从 \(u\) 号点出发第一次走到子集 \(S\) 中的点的期望时间。若 \(u\) 在集合中则 \(f(u)=0\) ,否则

\[f(u)=1+d_uf(fa_u) +d_u(\sum f(ch_u))
\]

(其中 \(d_u=\frac{1}{deg[u]}\),\(deg[u]\) 表示 \(u\) 的度数。 )

设 \(f_u=k_uf(fa_u)+b_u\) 。

令 \(sk_u=\sum k_{ch_u}, sb_u=\sum b_{ch_u},\)

\[\begin{align*}
f(u) &=1+d_uf(fa_u) +d_u(sk_uf(u)+sb_u) \\
(1-sk_u)f(u) &=d_uf(fa_u)+d_usb_u+1
\end{align*}
\]

由上式可得:

\[k_u=\frac{d_u}{1-sk_u}, b_u=\frac{d_usb_u+1}{1-sk_u}
\]

故我们直接一边 dfs 即可求出。

最后高维前缀和求 \(E(\max(S))\) ,询问直接输出即可。复杂度 \(O(n\cdot 2^n)\) 。

#include<bits/stdc++.h>
const int N=21,M=(1<<18)+5,Mod=998244353;
int head[N],nxt[N<<1],to[N<<1],n,q,x,s,d[N],f[M],k[N],b[N];
inline int mul(int x, int y) { return 1ll*x*y%Mod; }
inline int po(int x, int y)
{
int r=1;
while(y)
{
if(y&1) r=mul(r,x);
x=mul(x,x), y>>=1;
}
return r;
}
void addedge(int u, int v, int now) {
nxt[now]=head[u], head[u]=now, to[now]=v;
}
void dfs(int u, int fa)
{
k[u]=b[u]=0;
if(s&(1<<u-1)) return ;
int sk=0,sb=0;
for(int e=head[u];e;e=nxt[e])
{
if(to[e]==fa) continue;
dfs(to[e],u);
sk=(sk+k[to[e]])%Mod,sb=(sb+b[to[e]])%Mod;
}
int tmp=po(Mod+1-mul(d[u],sk),Mod-2);
k[u]=mul(d[u],tmp),b[u]=mul(mul(d[u],sb)+1,tmp);
}
int main()
{
scanf("%d%d%d",&n,&q,&x);
for(int i=1;i<n;++i)
{
int u,v; scanf("%d%d",&u,&v);
addedge(u,v,i*2-1);
addedge(v,u,i*2);
++d[u],++d[v];
}
for(int i=1;i<=n;++i) d[i]=po(d[i],Mod-2);
for(s=1;s<(1<<n);++s)
{
dfs(x,x);
f[s]=__builtin_popcount(s)&1?b[x]:Mod-b[x];
}
for(int i=0;i<n;++i)
for(int j=0;j<(1<<n);++j)
if(j&(1<<i)) f[j]=(f[j]+f[j^(1<<i)])%Mod;
while(q--)
{
int k,now=0; scanf("%d",&k);
for(int i=1;i<=k;++i)
{
int x; scanf("%d",&x);
now|=(1<<x-1);
}
printf("%d\n",f[now]);
}
}

【LOJ2542】「PKUWC2018」随机游走的更多相关文章

  1. LOJ2542. 「PKUWC2018」随机游走

    LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...

  2. loj2542「PKUWC2018」随机游走

    题目描述 给定一棵 nn 个结点的树,你从点 xx 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 QQ 次询问,每次询问给定一个集合 SS,求如果从 xx 出发一直随机游走,直到点集 SS ...

  3. loj2542 「PKUWC2018」随机游走 【树形dp + 状压dp + 数学】

    题目链接 loj2542 题解 设\(f[i][S]\)表示从\(i\)节点出发,走完\(S\)集合中的点的期望步数 记\(de[i]\)为\(i\)的度数,\(E\)为边集,我们很容易写出状态转移方 ...

  4. LOJ2542. 「PKUWC2018」随机游走【概率期望DP+Min-Max容斥(最值反演)】

    题面 思路 我们可以把到每个点的期望步数算出来取max?但是直接算显然是不行的 那就可以用Min-Max来容斥一下 设\(g_{s}\)是从x到s中任意一个点的最小步数 设\(f_{s}\)是从x到s ...

  5. loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP

    题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...

  6. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  7. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

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

    $ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...

  9. 「PKUWC2018」随机游走

    题目 我暴力过啦 看到这样的东西我们先搬出来\(min-max\)容斥 我们设\(max(S)\)表示\(x\)到达点集\(S\)的期望最晚时间,也就是我们要求的答案了 显然我们也很难求出这个东西,但 ...

随机推荐

  1. 吴裕雄 python 神经网络——TensorFlow ckpt文件保存方法

    import tensorflow as tf v1 = tf.Variable(tf.random_normal([1], stddev=1, seed=1)) v2 = tf.Variable(t ...

  2. 电源适配器DC插头规格

    电源适配器 DC 插头的内径外径规格有 (单位为 MM) :2.0*0.72.35*0.72.35*1.12.5*0.73.5*1.13.5*1.354.0*1.75.5*2.15.5*2.54.75 ...

  3. 安装插件报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++

    起因:学到多线程greenlet模块时,greenlet模块死活装不上,以为pycharm坏掉了,浪费了一下午. #pip3 install greenlet from greenlet import ...

  4. 【降维】主成分分析PCA推导

    本博客根据 百面机器学习,算法工程师带你去面试 一书总结归纳,公式都是出自该书. 本博客仅为个人总结学习,非商业用途,侵删. 网址 http://www.ptpress.com.cn 目录: PCA最 ...

  5. Java自学-集合框架 HashMap和Hashtable的区别

    HashMap和Hashtable之间的区别 步骤 1 : HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式 区别1: Hash ...

  6. [python] pygame安装与配置

    参考 https://www.runoob.com/python/python-install.html https://blog.csdn.net/huayuhuan/article/details ...

  7. Swift3.0-基础知识

    本文对Swift做一个从OC的角度的基础知识简单概要. Swift OC 说明 let.var const 在OC中不用const声明的常量,都认为是变量 Float.Double CGFloat   ...

  8. CSS阴影 box-shadow属性用法

    box-shadow: 它可以设置一个或者多个下拉阴影的框 语法:box-shadow:h-shadow v-shadow blur spread color inset 注意:该属性把一个或者多个下 ...

  9. 【转】CentOS6开启BBR加速

    1.查看机器内核 BBR 算法需要 Linux 4.9 及以上的内核支持,所以想要使用该方式的需要先升级内核版本. 在 Cent OS 7 上的 Linux 内核是 3.10, 使用 uname -r ...

  10. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...