题解 P3412 【仓鼠找sugar II】

2021/5/19 10:57:32

本文主要是介绍题解 P3412 【仓鼠找sugar II】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

\(\huge\texttt{P3412}\)

题意

给定一棵树,求任意一条路径从起点随机游走到终点的期望距离的期望。

思路

讨论求出每条边的贡献,当且仅当每条路径两个端点分别在这条边分成两个连通块中。

其中向上的期望可以从 \(u->fa[u]\) 或者 \(u->v->u->fa[u]\)。

向下的期望可以从 \(u->v\) 或者 \(u->v'->u->v\) 或者 \(u->fa[u]->u->v\)(\(v'\in u\&v'\ne v\))。

然后发现这些都可以通过已知项求得,对其讨论即可。

然后列式子求解每条边向上走向下走的期望步数即可,为了方便标记每条边,\(up[u]\) 和 \(down[u]\) 都表示连 \(u\) 的父边,而 \(up\) 表示向上,\(down\) 对应向下。

则会有下面的式子(感觉我推烦了,但还是比较清晰的吧):

令 \(sum[u]=\sum_{v\in u} up[v]\),\(v\in u\) 表示v是u的子节点,\(p[u]\) 表示 \(u\) 的连边数量。

\[up[u]=\frac{1}{p[u]}+\frac{1}{p[u]}(\sum_{v\in u}(1+up[v]+up[u]))\\ up[u]=\frac{1}{p[u]}+\frac{(p[u]-1)up[u]}{p[u]}+\frac{1}{p[u]}(\sum_{v\in u}(1+up[v]))\\ up[u]=1+p[u]-1+\sum_{v\in u}up[v]\\ up[u]=p[u]+\sum_{v\in u}up[v] \]

\[down[u]=\frac{1}{p[fa[u]]}+\frac{1}{p[fa[u]]}(\sum_{v\in fa[u]\&v\ne u}1+up[v]+down[u])+\frac{1}{p[fa[u]]}(1+down[fa[u]]+down[u])\\ donw[u]=1+\frac{(p-1)(down[u])}{p[fa[u]]}+\frac{1}{p[fa[u]]}(sum[fa[u]]-up[u]+down[fa[u]])\\ down[u]=p[fa[u]]+sum[fa[u]]-up[u]+down[fa[u]] \]

然后就很容易了。

代码

int a, b, up[N + 5], sum[N + 5], down[N + 5], ans, siz[N + 5];
vector<int> st[N + 5];

void dfs(int n, int fa) {
	siz[n] = 1;
	rep(i, 0, siz(st[n]) - 1) {
		int v = st[n][i];
		if (v == fa) continue;
		dfs(v, n);
		siz[n] += siz[v];
		(sum[n] += up[v]) %= mod;
	}
	up[n] = (siz(st[n]) + sum[n]) % mod;
}

void Dfs(int n, int fa) {
	if (n != 1) down[n] = (siz(st[fa]) + sum[fa] - up[n] + down[fa] + mod) % mod;
	(ans += siz[n] * (a - siz[n]) % mod * (down[n] + up[n]) % mod) %= mod;
	rep(i, 0, siz(st[n]) - 1) {
		int v = st[n][i];
		if (v == fa) continue;
		Dfs(v, n);
	}
}

int qpow(int n, int m = mod - 2) {
	int res = 1;
	for (; m; m >>= 1) {
		if (m & 1) res = res * n % mod;
		n = n * n % mod;
	}
	return res;
}

signed main() {
	// freopen("in1.in", "r", stdin);
	// freopen("out.out", "w", stdout);
	a = read();
	int x, y;
	rep(i, 1, a - 1) {
		x = read();
		y = read();
		st[x].PB(y);
		st[y].PB(x);
	}
	dfs(1, 0);
	Dfs(1, 0);
	printf("%lld", ans * qpow(a * a % mod) % mod);
	return 0;
}


这篇关于题解 P3412 【仓鼠找sugar II】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程