QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#756168#1. I/O TestbaoyangawaCompile Error//C++144.7kb2024-11-16 19:12:572024-11-16 19:12:58

Judging History

你现在查看的是最新测评结果

  • [2024-11-16 19:12:58]
  • 评测
  • [2024-11-16 19:12:57]
  • 提交

config.txt


input_test

#include <bits/stdc++.h>
#define int long long
#define frr(a) freopen(a, "r", stdin)
#define fww(a) freopen(a, "w", stdout)
#define eb emplace_back
using namespace std;
using ll = long long;
struct fio {
    char gc() {return getchar();}
    template <typename T> void read(T& x) {
        cin >> x; return;
        char c = gc(), l = 0; x = 0;
        while (!isdigit(c)) l = c, c = gc();
        while ( isdigit(c)) x = (x << 1) + (x << 3) + c - 48, c = gc();
        if (l == '-') x = -x;
    }
    template <typename T, typename ...A> void read(T& x, A&... a) {
        read(x), read(a...);
    }
} IO;
const int N = 2e5 + 10, mod = 998244353;
ll qpow(ll a, ll n = mod - 2) {
    ll res = 1;
    while (n) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod, n >>= 1;
    } return res;
}
struct ED {
    ll v, nxt;
    ED(int a = 0, int b = 0) {
        v = a, nxt = b;
    }
} edge[2 * N]; ll head[N], tote;
void adde(ll u, ll v) {
    edge[++tote] = ED(v, head[u]);
    head[u] = tote;
}
ll n;
ll d[N], sz[N], v[N], sumv[N], vd[N], sumvd[N], vd2[N], sumvd2[N];
void clr() {
    for (int i = 0; i <= n; i++) {
        d[i] = sz[i] = v[i] = sumv[i] = vd[i] = sumvd[i] = vd2[i] = sumvd2[i] = head[i] = 0;
    } 
    for (int i = 1; i <= tote; i++) edge[i] = ED();
    tote = 0;
}
void dfs1(int x = 1, int fat = 0) {
    d[x] = d[fat] + 1; sz[x] = 1;
    ll S = 0;
    for (int i = head[x]; i; i = edge[i].nxt) {
        int y = edge[i].v; if (y == fat) continue;
        dfs1(y, x); (sz[x] += sz[y]) %= mod;
        (v[x] += sz[y] * S % mod) %= mod; (S += sz[y]) %= mod;
        (sumv[x] += sumv[y]) %= mod;
        (sumvd[x] += sumvd[y]) %= mod;
        (sumvd2[x] += sumvd2[y]) %= mod;
    } 
    v[x] = (v[x] * 2ll % mod + 2ll * sz[x] % mod - 1) % mod, (sumv[x] += v[x]) %= mod;
    vd[x] = v[x] * d[x] % mod, (sumvd[x] += vd[x]) %= mod;
    vd2[x] = v[x] * d[x] % mod * d[x] % mod, (sumvd2[x] += vd2[x]) %= mod;
}
ll res = 0;
void dfs2(int x = 1, int fat = 0, ll delv = 0, ll delvd = 0) { // 分岔路径的贡献
    ll val1 = v[x] * d[x] % mod * d[x] % mod * (sumv[1] - delv - sumv[x]) % mod; // vx * vy * dx^2
    (res += val1) %= mod;
    ll val2 = 0, sum2 = 0; // vx * vy * dlca ^ 2
    ll val3 = vd[x] * (sumvd[1] - delvd - sumvd[x]) % mod; // 2 * vx * vy * dx * dy
    (res += val3) %= mod;
    ll val4 = 0, sum4 = 0; // -4 * vx * vy * dx * dlca
    for (int i = head[x]; i; i = edge[i].nxt) {
        int y = edge[i].v; if (y == fat) continue;
        dfs2(y, x, delv + v[x], delvd + vd[x]);
        (val2 += sum2 * sumv[y] % mod) %= mod; 
        (val4 += sum2 * sumvd[y] % mod + sum4 * sumv[y] % mod) %= mod, (sum4 += sumvd[y]) %= mod;
        (sum2 += sumv[y]) %= mod;
    }
    (res += 4ll * val2 % mod * d[x] % mod * d[x] % mod) %= mod;
    (res += -4ll * val4 % mod * d[x] % mod) %= mod;

    // printf("x:%d val1:%lld val2:%lld(%lld) val3:%lld val4:%lld\n", x, val1, val2, 8ll * val2 % mod * d[x] % mod * d[x] % mod, val3, val4);
}
void dfs3(int x = 1, int fat = 0) {
    ll pres = n - sz[x], prev = 0;
    for (int i = head[x]; i; i = edge[i].nxt) {
        int y = edge[i].v; if (y == fat) continue;
        dfs3(y, x);
        (prev += pres * sz[y] % mod) %= mod, (pres += sz[y]) %= mod;
    } prev = (prev * 2ll) % mod;

    // printf("before x:%d res:%lld\n", x, res);

    for (int i = head[x]; i; i = edge[i].nxt) {
        int y = edge[i].v; if (y == fat) continue;
        ll T = prev;
        (T -= sz[y] * (n - sz[y] - 1) % mod * 2ll % mod) %= mod;
        (T += 2ll * (n - sz[y]) % mod - 1) %= mod; // 我们必须相信 T 算的是对的
        T %= mod;
        // printf("x:%d y:%d T:%lld\n", x, y, T);
        ll val1 = T * d[x] % mod * d[x] % mod * sumv[y] % mod;
        (res += val1) %= mod;
        ll val2 = T * sumvd2[y] % mod;
        (res += val2) %= mod;
        ll val3 = 2ll * T % mod * d[x] % mod * sumvd[y] % mod;
        (res -= val3) %= mod;
    }
}
void solve() {
    res = 0;
    IO.read(n);
    for (int i = 1; i < n; i++) {
        int u, v; IO.read(u, v);
        adde(u, v), adde(v, u);
    }
    dfs1();
    // for (int i = 1; i <= n; i++) {
    //     printf("i:%d v:%lld\n", i, v[i]);
    // }
    // printf("res1:%lld\n", res);
    dfs2(); // 分岔路径的贡献
    // printf("res2:%lld\n", res);
    dfs3();
    // printf("res3:%lld\n", res);
    ll mu = (1ll * n * (n - 1) / 2ll) % mod; mu = qpow(mu * mu % mod);
    res = res * mu % mod;
    printf("%lld\n", (res + mod) % mod);
    clr();
}
signed main() {
    // frr("1.in");
    // fww("1.out");
    int Ts; IO.read(Ts);
    while (Ts--) solve();
    return 0;
}
/*
1
3
1 2
2 3



5
1 2
1 5
3 2
4 2

*/

output_test


详细

Invalid Configuration File: failed to read Nin and Nout