提出 #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 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |