int a, b; for (int i = 1; i < n; i ++) { //注意n个点, n - 1条边 cin >> a >> b; g[a].push_back(b); g[b].push_back(a); }
auto dfs = [&] (int u, int f, auto self) -> void { dep[u] = dep[f] + 1; fa[u] = f; siz[u] = 1; for (auto v : g[u]) { if (v == f) continue; self(v, u, self); siz[u] += siz[v]; } };
dfs(1, 0, dfs);
int dist = 0, disp = 0, m = 0, ans = 0; for (int i = 1; i <= n; i ++) { dist = (dist + (siz[i] * (n - siz[i]) % mod)) % mod; //累加也要取模 } for (int i = 1; i <= n; i ++) { disp = (disp + (dep[i] * (dep[i] - 1) ) / 2 % mod) % mod; }
for (int i = 1; i <= n; i ++) { m = (m + (siz[i] - 1)) % mod; }
ans = (dist - disp + m) % mod; ans = (ans + mod) % mod; //防止z负数 cout << ans << endl; }