QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#834796 | #9530. A Game On Tree | Kopicy | WA | 4ms | 3652kb | C++23 | 5.5kb | 2024-12-28 00:00:20 | 2024-12-28 00:00:23 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int __int128
#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;
}
namespace my128 {
using i64 = __int128_t;
i64 abs(const i64 &x) {
return x > 0 ? x : -x;
}
auto &operator>>(istream &it, i64 &j) {
string val;
it >> val;
reverse(val.begin(), val.end());
i64 ans = 0;
bool f = 0;
char c = val.back();
val.pop_back();
for (; c < '0' || c > '9'; c = val.back(), val.pop_back()) {
if (c == '-') {
f = 1;
}
}
for (; c >= '0' && c <= '9'; c = val.back(), val.pop_back()) {
ans = ans * 10 + c - '0';
}
j = f ? -ans : ans;
return it;
}
auto &operator<<(ostream &os, const i64 &j) {
string ans;
function<void(i64)> write = [&](i64 x) {
if (x < 0) ans += '-', x = -x;
if (x > 9) write(x / 10);
ans += x % 10 + '0';
};
write(j);
return os << ans;
}
}
using namespace my128;
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();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3580kb
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: 4ms
memory: 3652kb
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'