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

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

就是节点的期望与父亲的期望上表述有一次性。也就是说 fu=auffa+bu 这个式子。

CF1823F Random Walk

树上随机游走,求 st 的路上,1n 的期望经过次数。

考虑如下式子:

ft=1

fu=vE,vtfvdegv

fs=1+vE,vtfvdegv

利用这些可以 O(n3) 高斯消元。

然后考虑如上结论 : fu=auffa+bu,注意一些 t 的情况暂时没有考虑。

fu=ffadegfa+vSfvdegv+[u=s]

fu=ffadegfa+vSavfu+bvdegv+[u=s]

fu=ffadegfa+vSavdegvfu+bvdegv+[u=s]

(1vSavdegv)fu=ffadegfa+bvdegv+[u=s]

除过去即可求得 aubu,为左右两项。根节点和叶子好求,于是就求出来了。除过去有些是 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 @   Cust10  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示