QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#834794 | #9530. A Game On Tree | Kopicy | WA | 3ms | 3836kb | C++23 | 4.5kb | 2024-12-27 23:57:12 | 2024-12-27 23:57:13 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define per(i, a, b) for(int i=(a);i>=(b);--i)
#define IOS std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define vv vector
#define sz(x) (int)x.size()
#define endl "\n"
const int inf = 1e18, N = 3e5 + 5, mod = 998244353, m1 = 1;
int qpw(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int inv(int x) { return qpw(x, mod - 2); }
void solve() {
int n;
cin >> n;
vv<vv<int>> g(n + 1);
rep(i, 1, n - 1) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
vv<int> siz(n + 1), maxs(n + 1), del(n + 1);
vv<int> dist(n + 1), siz2(n + 1), val(n + 1);
int ans = 0;
auto sol = [&](auto &&self, int u, int s) -> void {
int ms = s + 1, rt = -1;
auto dfs1 = [&](auto &&self, int u, int pr) -> void {
siz[u] = 1;
maxs[u] = 0;
dist[u] = 0;
siz2[u] = 0;
val[u] = 0;
for (int v: g[u]) {
if (del[v] || v == pr) continue;
self(self, v, u);
siz[u] += siz[v];
maxs[u] = max(maxs[u], siz[v]);
}
maxs[u] = max(maxs[u], s - maxs[u]);
if (maxs[u] < ms) ms = maxs[u], rt = u;
};
dfs1(dfs1, u, 0);
int sum1 = 0, sum2 = 0, sum3 = 0;
int totSiz = 1, Siz2 = 0;
for (int v: g[rt]) {
if (del[v]) continue;
auto dfs = [&](auto &&self, int u, int pr) -> void {
dist[u] = dist[pr] + 1;
siz2[u] = 1;
siz[u] = 1;
for (int v: g[u]) {
if (v == pr || del[v]) continue;
self(self, v, u);
siz2[u] += siz2[v];
siz[u] += siz[v];
}
};
dfs(dfs, v, rt);
(Siz2 += siz2[v] * siz2[v] % mod) %= mod;
(totSiz += siz2[v]);
auto dfs2 = [&](auto &&self, int u, int pr) -> void {
val[u] = siz2[u] * siz2[u] % mod;
for (int v: g[u]) {
if (v == pr || del[v]) continue;
self(self, v, u);
val[u] = (val[u] - siz2[v] * siz2[v] % mod + mod) % mod;
}
};
dfs2(dfs2, v, rt);
auto dfs3 = [&](auto &&self, int u, int pr) -> void {
ans += sum1 * dist[u] * dist[u] % mod * val[u] % mod;
ans %= mod;
ans += sum2 * val[u] % mod;
ans %= mod;
ans += dist[u] * val[u] % mod * sum3 % mod;
ans %= mod;
for (int v: g[u]) {
if (v == pr || del[v]) continue;
self(self, v, u);
}
};
dfs3(dfs3, v, rt);
auto dfs4 = [&](auto &&self, int u, int pr) -> void {
(sum1 += val[u]) %= mod;
(sum2 += dist[u] * dist[u] % mod * val[u] % mod) %= mod;
(sum3 += dist[u] * val[u] % mod * 2 % mod) %= mod;
for (int v: g[u]) {
if (v == pr || del[v]) continue;
self(self, v, u);
}
};
dfs4(dfs4, v, rt);
}
int out=n-totSiz;
totSiz=n;(Siz2+=out*out%mod)%=mod;
for (int v: g[rt]) {
if (del[v]) continue;
int totSiz2 = totSiz - siz2[v], siz22 = (Siz2 - siz2[v] * siz2[v] % mod + mod) % mod;
int ret = (totSiz2 * totSiz2 % mod - siz22 + mod) % mod;
auto dfs = [&](auto &&self, int u, int pr) -> void {
ans = (ans + ret * dist[u] % mod * dist[u] % mod * val[u] % mod) % mod;
for (int v: g[u]) {
if (v == pr || del[v]) continue;
self(self, v, u);
}
};
dfs(dfs, v, rt);
}
del[rt] = 1;
for (auto v: g[rt]) {
if (del[v]) continue;
self(self, v, siz[v]);
}
};
sol(sol, 1, n);
int tot = (n * (n - 1) / 2 % mod) * (n * (n - 1) / 2 % mod) % mod;
cout << ans * inv(tot) % mod << endl;
}
signed main() {
IOS
int te = 1;
cin >> te;
while (te--) solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3836kb
input:
2 3 1 2 2 3 5 1 2 1 5 3 2 4 2
output:
443664158 918384806
result:
ok 2 lines
Test #2:
score: -100
Wrong Answer
time: 3ms
memory: 3804kb
input:
1000 7 3 6 4 3 5 3 2 6 1 4 7 1 12 5 7 10 7 2 10 11 2 1 7 8 1 4 2 9 11 6 9 12 11 3 5 6 2 5 1 2 4 5 6 4 3 6 5 2 5 1 5 4 5 3 2 8 1 8 2 8 4 2 6 1 5 6 7 6 3 8 8 3 8 7 3 4 8 6 4 2 7 5 2 1 4 4 3 1 4 3 2 1 6 5 1 6 1 2 5 3 5 4 2 12 8 11 5 11 12 8 3 12 6 12 2 3 4 6 10 11 1 5 9 5 7 5 9 6 1 7 6 4 7 8 7 5 4 9 6 ...
output:
948445317 537163631 363804611 918384806 711758412 935854084 776412276 869581749 576350909 284992603 938164834 717873256 868225091 670079545 435776797 908032643 29104004 584006902 60634104 221832080 300435804 56023919 867301808 183319566 698771049 503247155 955849780 365428738 310564911 286902823 368...
result:
wrong answer 2nd lines differ - expected: '468414020', found: '537163631'