对于树上随机游走的一类研究。

我们可以考虑使用高斯消元求期望,虽然 \(O(n^3)\) 但是很有一些启发性。

就是节点的期望与父亲的期望上表述有一次性。也就是说 \(f_u = a_uf_{fa} + b_u\) 这个式子。

CF1823F Random Walk

树上随机游走,求 \(s\to t\) 的路上,\(1 \to n\) 的期望经过次数。

考虑如下式子:

\[f_t = 1 \]

\[f_u = \sum_{v \in E, v \neq t} \frac{f_v}{deg_v} \]

\[f_s = 1 + \sum_{v \in E, v \neq t} \frac{f_v}{deg_v} \]

利用这些可以 \(O(n ^ 3)\) 高斯消元。

然后考虑如上结论 : \(f_u = a_uf_{fa} + b_u\),注意一些 \(t\) 的情况暂时没有考虑。

\[f_u = \frac{f_{fa}}{deg_{fa}} + \sum_{v \in S}\frac{f_v}{deg_v} + [u = s] \]

\[f_u = \frac{f_{fa}}{deg_{fa}} + \sum_{v \in S}\frac{a_vf_u + b_v}{deg_v} + [u = s] \]

\[f_u = \frac{f_{fa}}{deg_{fa}} + \sum_{v \in S}\frac{a_v}{deg_v}f_u + \sum\frac{b_v}{deg_v} + [u = s] \]

\[(1 - \sum_{v \in S}\frac{a_v}{deg_v})f_u = \frac{f_{fa}}{deg_{fa}} + \sum\frac{b_v}{deg_v} + [u = s] \]

除过去即可求得 \(a_u\)\(b_u\),为左右两项。根节点和叶子好求,于是就求出来了。除过去有些是 0!/fn

void dfs1 (int x, int fa) {
	if (x == t) {
		f[x] = 1, a[x] = invd[fa], b[x] = 0;
		return ;
	}
	int suma = 0, sumb = (x == s);
	for (int y : e[x]) {
		if (y == fa) continue ;
		dfs1(y, x);
		if (y == t) continue ;
		suma = add(suma, 1ll * a[y] * invd[y] % mod),
		sumb = add(sumb, 1ll * b[y] * invd[y] % mod);
	}
	suma = sub(1, suma);
	a[x] = 1ll * power(suma, mod - 2) * invd[fa] % mod;
	b[x] = 1ll * power(suma, mod - 2) * sumb % mod;
}
void dfs2 (int x, int fa) {
	if (x == t) { return ; }
	f[x] = add(1ll * a[x] * f[fa] % mod, b[x]);
	for (int y : e[x]) if (y != fa) dfs2(y, x);
}
posted @ 2023-07-19 16:32  Cust10  阅读(103)  评论(0)    收藏  举报