fork download
#include <bits/stdc++.h>
using namespace std;

long long n, p, q, ans[200069], dsu[200069], sm[200069], szp, szq;
vector<long long> cc[200069];
const long long mo = 998244353;

void mrg(long long x, long long y)
{
	y = cc[dsu[y]][0];
	x = cc[dsu[x]][0];
	while (cc[y].size())
	{
		ans[cc[y].back()] = (ans[cc[y].back()]+sm[y]-sm[x]+mo)%mo;
		dsu[cc[y].back()] = x;
		cc[x].push_back(cc[y].back());
		cc[y].pop_back();
	}
}

long long fe(long long x, long long y)
{
	long long res = 1;
	while (y)
	{
		if (y%2) res = (res*x)%mo;
		x = (x*x)%mo;
		y /= 2;
	}
	return res;
}

int main()
{
	long long i;
	scanf("%lld", &n);
	for (i=1; i<=n; i++)
	{
		dsu[i] = i;
		cc[i].push_back(i);
	}
	for (i=1; i<=n-1; i++)
	{
		scanf("%lld%lld", &p, &q);
		szp = cc[dsu[p]].size();
		szq = cc[dsu[q]].size();
		printf("p = %lld q = %lld szp = %lld szq = %lld dsu[p] = %lld dsu[q] = %lld\n", p, q, szp, szq, dsu[p], dsu[q]);
		if (szp<szq) swap(p, q);
		(sm[dsu[p]] += szp*fe(szp+szq, mo-2)%mo) %= mo;
		(sm[dsu[q]] += szq*fe(szp+szq, mo-2)%mo) %= mo;
		mrg(p, q);
	}
	for (i=1; i<=n; i++) printf("%lld ", (ans[i]+sm[dsu[i]])%mo);
	printf("\n");
}
Success #stdin #stdout 0.01s 10860KB
stdin
5
1 2
4 3
5 3
1 4
stdout
p = 1 q = 2 szp = 1 szq = 1 dsu[p] = 1 dsu[q] = 2
p = 4 q = 3 szp = 1 szq = 1 dsu[p] = 4 dsu[q] = 3
p = 5 q = 3 szp = 1 szq = 2 dsu[p] = 5 dsu[q] = 4
p = 1 q = 4 szp = 2 szq = 3 dsu[p] = 1 dsu[q] = 4
299473307 299473307 33274813 33274813 865145107