QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#697168 | #9530. A Game On Tree | qiubobo | WA | 4ms | 8268kb | C++14 | 3.1kb | 2024-11-01 11:34:29 | 2024-11-01 11:34:30 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
const int mod = 998244353;
int add(int a, int b) {
int c = a + b;
if (c >= mod) c -= mod;
return c;
}
int dec(int a, int b) {
int c = a - b;
if (c < 0) c += mod;
return c;
}
int mul(int a, int b) {
return 1ll * a * b % mod;
}
int qpow(int a, int b) {
int p = 1;
while (b) {
if (b & 1)
p = mul(p, a);
a = mul(a, a);
b >>= 1;
}
return p;
}
int n, ans;
vector<int> e[N];
int root, Mi, S;
int mx[N], siz[N];
bool vis[N];
void findroot(int u, int fa) {
siz[u] = 1;
mx[u] = 0;
for (int v : e[u]) {
if (v == fa || vis[v])
continue;
findroot(v, u);
siz[u] += siz[v];
mx[u] = max(mx[u], siz[v]);
}
mx[u] = max(mx[u], S - siz[u]);
if (mx[u] < Mi) {
Mi = mx[u];
root = u;
}
}
/*
(du, fv)
fu = (\sum sizv)^2 - (\sum sizv^2)
(sizu + (n - sizu))^2
gv = n^2 - \sum sizv^2
fv = gu - 2sizv(n - sizv)
du^2fu * (\sum fv)
2dufu * (\sum fv*dv)
fu * (dv^2fv)
(du + dv) ^ 2 * fu * fv
*/
int g[N];
void dfs2(int u, int f) {
siz[u] = 1;
g[u] = mul(n, n);
for (int v : e[u])
if (v != f) {
dfs2(v, u);
siz[u] += siz[v];
g[u] = dec(g[u], qpow(siz[v], 2));
}
g[u] = dec(g[u], qpow(n - siz[u], 2));
}
int Dep[N], Siz[N], f[N];
int S1, S2, S3, s1, s2, s3;
void dfs(int u, int fa) {
Dep[u] = Dep[fa] + 1;
Siz[u] = 1;
f[u] = 0;
// cerr << "?dfs:" << u << endl;
// cerr << "?Dep:" << Dep[u] << endl;
for (int v : e[u]) {
if (v == fa || vis[v])
continue;
dfs(v, u);
Siz[u] += Siz[v];
}
f[u] = dec(g[u], mul(mul(2, Siz[u]), n - Siz[u]));
// cerr << "?u, f, g:" << u << ' ' << f[u] << ' ' << g[u] << endl;
ans = add(ans, mul(mul(qpow(Dep[u], 2), f[u]), S1));
ans = add(ans, mul(mul(2, mul(f[u], Dep[u])), S2));
ans = add(ans, mul(f[u], S3));
s1 = add(s1, f[u]);
s2 = add(s2, mul(f[u], Dep[u]));
s3 = add(s3, mul(qpow(Dep[u], 2), f[u]));
}
void divide(int u) {
// cerr << "divide:" << u << endl;
S1 = S2 = S3 = 0;
Dep[u] = 0;
vis[u] = 1;
Siz[u] = 1;
for (int v : e[u]) {
if (vis[v])
continue;
s1 = s2 = s3 = 0;
dfs(v, u);
Siz[u] += Siz[v];
int fu = dec(g[u], mul(mul(2, Siz[v]), n - Siz[v]));
ans = add(ans, mul(fu, s3));
S1 = add(S1, s1);
S2 = add(S2, s2);
S3 = add(S3, s3);
}
// cerr << "?" << ans << endl;
for (int v : e[u]) {
if (vis[v])
continue;
root = 0, Mi = 0x7fffffff, S = Siz[u];
findroot(v, u);
divide(root);
}
}
void init() {
ans = 0;
for (int i = 1; i <= n; i ++) {
e[i].clear();
vis[i] = 0;
}
}
void solve() {
cin >> n;
init();
for (int i = 1; i < n; i ++) {
int u, v;
cin >> u >> v;
e[u].emplace_back(v);
e[v].emplace_back(u);
}
dfs2(1, 0);
root = 0, Mi = 0x7fffffff, S = n;
findroot(1, 0);
divide(1);
cout << mul(ans, qpow(qpow(1ll * n * (n - 1) / 2 % mod, mod - 2), 2)) << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T --)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 6724kb
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: 8268kb
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:
982399208 498663851 310564915 918384806 711758412 385801075 776412276 869581749 110228547 765628773 63160525 129402049 19799896 940494682 347536928 297747949 844474393 584006902 951906100 221832080 950807129 453284428 867301808 278830600 259543535 366957926 449579681 599710576 310564911 286902823 36...
result:
wrong answer 1st lines differ - expected: '948445317', found: '982399208'