Description
有一个\(n\)个点的树,有一个固定的点为\(x\)。
\(Q\)次询问,每次给你一个集合。要求你求出从\(x\)出发,每一步都等概率随机选择一条邻边走过去,将集合中每个点都走了至少一遍的话期望的步数为多少(\(x\)视为一开始就经过了)。答案模\(998244353\)输出。
\(1\leq n\leq 18, Q\leq 5000\)。
Solution
高,高啊.jpg
考虑期望步数的实质是集合中最晚一个经过的点被经过的期望步数。最大值不好算,我们就考虑用MIN-MAX容斥,转成最小值。因此问题转化成了从\(x\)出发最早走到一个集合中至少一个点的期望步数。
这个东西的话,先枚举那个集合\(S\),然后考虑期望DP。设状态\(f_i\)表示从\(i\)出发的期望步数,那么有: \[
f_i =
\begin{cases}
0 & \text{if } i\in S,\\
\frac{f_{\mathrm{fa}_i}+\sum f_{\mathrm{ch}_{i, j}}}{d_i} + 1 & \text{if }i\notin S.
\end{cases}
\] 其中\(\mathrm{fa_i}\)表示\(i\)的父亲,\(\mathrm{ch}_{i, j}\)表示\(i\)的第\(j\)个儿子,\(d_i\)表示\(i\)的度数。如果这样直接高消做的话,那么DP+高消部分的复杂度是\(O(2^nn^3)\),有点吃不消(但据说可以过的)。
考虑到这样一件事:对于任意叶子或者是属于\(S\)的点,他们的\(f\)都可以表示为父亲的\(f\)的若干倍加上一个常数。那么我们DFS一遍,一个只有这两类点儿子的父亲\(i\)在DFS完了自己所有儿子之后,就能知道\(\sum f_{\mathrm{ch}_{i, j}}\)这个东西可以如何用\(f_i\)的若干倍加上一个常数来表示,这样一来移项再整理一下\(f_i\)也就可以用\(f_{\mathrm{fa}_i}\)的若干倍加上一个常数来表示了。如此往上一直推,推到根节点的话根节点的父亲的答案为0,所以最终答案就是那个最后的常数了。
Code
1 |
|