Tree_Sets.cpp

Anonymous
c_cpp
02/26/2026 3:18 AM
1.3 KB
36
Indexable
#include <bits/stdc++.h>
using namespace std;

// Time Complexity: O(n)
// Space Complexity: O(n)

using ll = long long;
const ll m = 998244353;

int n;
ll ans;
vector<ll> sub;
vector<vector<int>> adj;

void dfs(int x, int p) {
	ll val = 2;
	for(auto &y : adj[x]) {
		if(y == p) continue;
		dfs(y, x);
		sub[x] += sub[y];
		val *= (sub[y] + 1); val %= m;
	}
	ll up = (n - sub[x]);
	val *= (up + 1); val %= m;
	val = (val - n + m)%m; // rem size {0, 1} sets except yourself
	val = (val - (up*sub[x])%m + m)%m; // remove size {2} sets with upper
	// cout << "x - > " << x << " : val = " << val << "\n";
	ans += val; ans %= m;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);

	int tc; cin >> tc;
	while(tc--) {
		cin >> n;
		adj.assign(n, {});
		for(int i = 0; i < n-1; i++) {
			int u, v; cin >> u >> v;
			adj[u-1].push_back(v-1);
			adj[v-1].push_back(u-1);
		}
		ans = 0;
		sub.assign(n, 1);
		dfs(0, -1);
		cout << ans << "\n";
	}

	return 0;
}
Editor is loading...
Leave a Comment