結果
| 問題 | No.3445 Sum of (Tree Distances)^K 2 |
| コンテスト | |
| ユーザー |
👑 potato167
|
| 提出日時 | 2025-12-26 02:11:59 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,161 bytes |
| 記録 | |
| コンパイル時間 | 2,132 ms |
| コンパイル使用メモリ | 217,684 KB |
| 実行使用メモリ | 20,516 KB |
| 最終ジャッジ日時 | 2026-02-06 20:50:27 |
| 合計ジャッジ時間 | 9,128 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 TLE * 1 -- * 20 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
static const long long MOD = 998244353;
long long modpow(long long a, long long e) {
long long r = 1 % MOD;
a %= 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;
long long K;
cin >> N >> K;
// precompute i^K
vector<long long> pw(N + 1, 0);
for (int i = 1; i <= N; i++) pw[i] = modpow(i, K);
// factorials
vector<long long> fac(N + 1, 1), ifac(N + 1, 1);
for (int i = 1; i <= N; i++) fac[i] = fac[i - 1] * i % MOD;
ifac[N] = modpow(fac[N], MOD - 2);
for (int i = N; i >= 1; i--) ifac[i - 1] = ifac[i] * i % MOD;
// DP arrays: P holds P_m(c) for current m, c=1..len
// Start with m=1: P_1(c)=c^K, and the needed max c is N-1.
int len = N - 1;
vector<long long> P(N + 2, 0), Q(N + 2, 0);
for (int c = 1; c <= len; c++) P[c] = pw[c];
// F[a] = P_{a-1}(1)
vector<long long> F(N + 1, 0);
F[1] = 0;
// m is current size (number of vertices in the recursive tree)
// We will fill F[m+1] = P_m(1) for m=1..N-1.
for (int m = 1; m <= N - 1; m++) {
F[m + 1] = P[1]; // P_m(1) (valid for m <= N-1)
if (m == N - 1) break;
// compute P_{m+1}(c) for c=1..(len-1)
// recurrence: P_{m+1}(c)= m*P_m(c) + 2*P_m(c+1) + m!*c^K
// here m! = fac[m]
fill(Q.begin(), Q.end(), 0);
for (int c = 1; c <= len - 1; c++) {
long long val = 0;
val += (long long)m * P[c] % MOD;
val += 2LL * P[c + 1] % MOD;
val += fac[m] * pw[c] % MOD;
Q[c] = val % MOD;
}
P.swap(Q);
len--;
}
// Answer for each a:
// Ans[a] = (N-1)!/(a-1)! * F[a] (mod MOD)
for (int a = 1; a <= N; a++) {
long long ans = 0;
if (a == 1) {
ans = 0;
} else {
long long coef = fac[N - 1] * ifac[a - 1] % MOD;
ans = coef * (F[a] % MOD) % MOD;
}
cout << ans << "\n";
}
return 0;
}
potato167