提出 #69711324


ソースコード 拡げる

// authored by GPT-5 pro
#include <bits/stdc++.h>
using namespace std;

static const int MOD = 998244353;

long long modpow(long long a, long long e) {
    long long r = 1 % MOD;
    while (e > 0) {
        if (e & 1) r = (r * a) % MOD;
        a = (a * a) % MOD;
        e >>= 1;
    }
    return r;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    if (!(cin >> N)) return 0;
    vector<vector<int>> g(N);
    for (int i = 0; i < N - 1; ++i) {
        int a, b; cin >> a >> b;
        --a; --b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    // Precompute modular inverses up to 2N+2 (for 1/(2(k+1)))
    int LIM = 2 * N + 5;
    vector<int> inv(LIM);
    inv[1] = 1;
    for (int i = 2; i < LIM; ++i) {
        inv[i] = (long long)(MOD - MOD / i) * inv[MOD % i] % MOD;
    }

    // Convolution (naive) for polynomials in x^2
    auto mul = [&](const vector<int>& A, const vector<int>& B) -> vector<int> {
        vector<int> C(A.size() + B.size() - 1, 0);
        for (size_t i = 0; i < A.size(); ++i) {
            long long ai = A[i];
            for (size_t j = 0; j < B.size(); ++j) {
                C[i + j] = (C[i + j] + (ai * B[j]) % MOD) % MOD;
            }
        }
        return C;
    };

    vector<int> parent(N, -1);
    // Root the tree at 0
    {
        // simple BFS to set parent (optional; we’ll still DFS below)
        queue<int> q;
        q.push(0);
        parent[0] = 0;
        while (!q.empty()) {
            int v = q.front(); q.pop();
            for (int to : g[v]) if (parent[to] == -1) {
                parent[to] = v;
                q.push(to);
            }
        }
        parent[0] = -1;
    }

    // DFS returning (F_v polynomial, C_v)
    function<pair<vector<int>, int>(int,int)> dfs = [&](int v, int p) -> pair<vector<int>, int> {
        vector<vector<int>> childPolys;
        childPolys.reserve(g[v].size());
        for (int to : g[v]) if (to != p) {
            auto pr = dfs(to, v);
            childPolys.push_back(move(pr.first));
        }

        // Multiply child polynomials: Q_v(x) = prod F_child(x)
        sort(childPolys.begin(), childPolys.end(),
             [](const vector<int>& A, const vector<int>& B) { return A.size() < B.size(); });
        vector<int> Q(1, 1); // constant 1
        for (auto &P : childPolys) {
            Q = mul(Q, P);
        }

        // C_v = sum_{k} Q[k] / (2*(k+1))
        int C = 0;
        for (size_t k = 0; k < Q.size(); ++k) {
            int denom = 2 * (int(k) + 1);
            int term = (long long)Q[k] * inv[denom] % MOD;
            C += term; if (C >= MOD) C -= MOD;
        }

        // F_v(x) = C_v + x^2 * Q_v(x)  ==> coefficients in x^{2j}
        vector<int> F; F.resize(Q.size() + 1);
        F[0] = C;
        for (size_t j = 0; j < Q.size(); ++j) F[j + 1] = Q[j];

        return { move(F), C };
    };

    auto rootRes = dfs(0, -1);
    int C_root = rootRes.second; // integral at root

    // Multiply by (1/N)^N
    long long invN = modpow(N % MOD, MOD - 2);
    long long scale = modpow(invN, N);
    long long ans = (long long)C_root * scale % MOD;

    cout << ans << '\n';
    return 0;
}

提出情報

提出日時
問題 C - Product of Max of Sum of Subtree
ユーザ tour1st
言語 C++ 20 (gcc 12.2)
得点 1400
コード長 3292 Byte
結果 AC
実行時間 56 ms
メモリ 5060 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1400 / 1400
結果
AC × 5
AC × 33
セット名 テストケース
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 00-sample-005.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 00-sample-005.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt
ケース名 結果 実行時間 メモリ
00-sample-001.txt AC 1 ms 3424 KiB
00-sample-002.txt AC 1 ms 3388 KiB
00-sample-003.txt AC 1 ms 3448 KiB
00-sample-004.txt AC 1 ms 3332 KiB
00-sample-005.txt AC 1 ms 3472 KiB
01-001.txt AC 1 ms 3460 KiB
01-002.txt AC 1 ms 3336 KiB
01-003.txt AC 1 ms 3436 KiB
01-004.txt AC 12 ms 3704 KiB
01-005.txt AC 8 ms 3788 KiB
01-006.txt AC 7 ms 3644 KiB
01-007.txt AC 42 ms 5060 KiB
01-008.txt AC 56 ms 4192 KiB
01-009.txt AC 43 ms 4632 KiB
01-010.txt AC 27 ms 3876 KiB
01-011.txt AC 35 ms 4468 KiB
01-012.txt AC 27 ms 3880 KiB
01-013.txt AC 34 ms 4388 KiB
01-014.txt AC 36 ms 4096 KiB
01-015.txt AC 27 ms 3864 KiB
01-016.txt AC 27 ms 3948 KiB
01-017.txt AC 34 ms 4524 KiB
01-018.txt AC 36 ms 4108 KiB
01-019.txt AC 27 ms 4076 KiB
01-020.txt AC 27 ms 3976 KiB
01-021.txt AC 38 ms 4952 KiB
01-022.txt AC 35 ms 4224 KiB
01-023.txt AC 27 ms 4084 KiB
01-024.txt AC 34 ms 4748 KiB
01-025.txt AC 34 ms 4196 KiB
01-026.txt AC 45 ms 4884 KiB
01-027.txt AC 38 ms 4480 KiB
01-028.txt AC 33 ms 4212 KiB