QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#698385 | #7895. Graph Partitioning 2 | test_algth | WA | 38ms | 13684kb | C++14 | 2.2kb | 2024-11-01 19:16:44 | 2024-11-01 19:16:44 |
Judging History
answer
#include <bits/stdc++.h>
const int MAXN = 1.01E5;
const int MAXB = 500;
const int P = 998244353;
inline int add(int a, int b) {
return a -= (a += b) >= P ? P : 0;
}
inline void incr(int& a, int b) {
a = add(a, b);
}
int dp[MAXN][MAXB + 1], sz[MAXN], ndp[MAXB + 1];
int N, K;
std::unordered_map <int, int> f[MAXN], g;
std::vector <int> adj[MAXN];
inline void merge(int u, int v) {
for (int i = 0; i <= std::min(K + 1, sz[u] + sz[v]); ++i)
ndp[i] = 0;
for (int i = 0; i <= sz[u]; ++i) {
for (int j = 0; j <= sz[v] && i + j <= K + 1; ++j) {
incr(ndp[i + j], 1ll * dp[u][i] * dp[v][j] % P);
}
incr(ndp[i], 1ll * dp[u][i] * add(dp[v][K], dp[v][K + 1]) % P);
}
sz[u] += sz[v];
for (int i = 0; i <= std::min(K + 1, sz[u]); ++i)
dp[u][i] = ndp[i];
}
void solve(int u, int pa) {
sz[u] = dp[u][1] = 1;
for (int i = 2; i <= K; ++i)
dp[u][i] = 0;
for (int v : adj[u]) {
if (v == pa) continue;
solve(v, u);
merge(u, v);
}
}
inline void merge2(int u, int v) {
g.clear();
for (auto [a, b] : f[u]) {
for (auto [c, d] : f[v]) {
if (a + c <= K + 1) {
incr(g[a + c], 1ll * b * d % P);
}
}
if (f[v].count(K)) {
incr(g[a], 1ll * b * f[v][K] % P);
}
if (f[v].count(K + 1)) {
incr(g[a], 1ll * b * f[v][K + 1]);
}
}
f[u] = g;
}
void solve2(int u, int pa) {
f[u].clear();
f[u][1] = 1;
for (int v : adj[u]) {
if (v == pa) continue;
solve2(v, u);
merge2(u, v);
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int testCase = 1;
std::cin >> testCase;
while (testCase--) {
std::cin >> N >> K;
for (int i = 1; i <= N; ++i) {
adj[i].clear();
}
for (int i = 1, u, v; i < N; ++i) {
std::cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
if (K < MAXB) {
solve(1, 1);
std::cout << add(dp[1][K], dp[1][K + 1]) << '\n';
}
else {
solve2(1, 1);
std::cout << add(f[1][K], f[1][K + 1]) << '\n';
}
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 11564kb
input:
2 8 2 1 2 3 1 4 6 3 5 2 4 8 5 5 7 4 3 1 2 1 3 2 4
output:
2 1
result:
ok 2 lines
Test #2:
score: -100
Wrong Answer
time: 38ms
memory: 13684kb
input:
5550 13 4 10 3 9 1 10 8 3 11 8 5 10 7 9 6 13 5 9 7 2 7 5 12 4 8 8 2 4 1 3 4 7 8 2 5 6 7 4 8 2 3 11 1 11 10 1 4 9 10 8 4 3 6 5 7 6 1 10 2 11 7 11 1 17 2 14 16 13 15 17 3 15 11 1 6 13 2 13 17 4 8 14 10 8 14 14 5 9 12 14 2 12 17 17 6 15 7 14 6 2 14 2 13 2 4 8 4 3 11 7 3 14 1 11 9 13 3 5 10 6 8 3 10 14 ...
output:
0 5 512 36 1 0 1 3 0 0 1 0 1 0 0 1 0 222 0 0 0 1381 1 17 6 1 2 2 0 1044 0 1 0 0 0 1 1 0 0 344 39743328 0 0 4617 2 0 1 0 1356 1 691069 152237970 3 384 0 1 0 73 0 0 0 0 0 1 0 0 0 1 0 1 1 1 421 0 0 0 2 0 0 0 2 0 1 1 1 1 1 0 0 0 1 1 0 0 77 0 5 0 2 0 2 656 0 578 0 0 208 0 1 0 0 2 0 2 4 0 1 3 0 0 12 0 1 1...
result:
wrong answer 2nd lines differ - expected: '3', found: '5'