QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#300484 | #7895. Graph Partitioning 2 | ucup-team2818# | WA | 14ms | 18716kb | C++14 | 3.1kb | 2024-01-08 12:36:54 | 2024-01-08 12:36:54 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int maxn = 1e5 + 5;
const int B = 320;
int n, K, siz[maxn];
vector<int> G[maxn];
ll dp[maxn][B], g[B];
void dfs(int u, int fu)
{
siz[u] = 1;
for (int i = 0; i <= K + 1; i++) dp[u][i] = 0;
dp[u][1] = 1;
for (int v : G[u])
{
if (v == fu) continue;
dfs(v, u);
for (int j = 1; j <= min(K + 1, siz[u]); j++)
{
for (int k = 0; k <= min(K + 1 - j, siz[v]); k++)
(g[j + k] += dp[v][k] * dp[u][j]) %= mod;
(g[j] += dp[u][j] * dp[v][K]) %= mod;
(g[j] += dp[u][j] * dp[v][K + 1]) %= mod;
}
siz[u] += siz[v];
for (int j = 1; j <= min(K + 1, siz[u]); j++)
dp[u][j] = g[j], g[j] = 0;
}
}
void work1()
{
dfs(1, 0);
cout << (dp[1][K] + dp[1][K + 1]) % mod << "\n";
}
ll f[maxn][B], f2[maxn], fk[maxn][B], h[B];
void dfs2(int u, int fu)
{
siz[u] = 1;
f2[u] = 0;
for (int i = 0; i <= n / K; i++) f[u][i] = fk[u][i] = 0;
f[u][0] = 1;
int sum = 0;
for (int v : G[u])
{
if (v == fu) continue;
dfs2(v, u);
int x = siz[v] / K, y = siz[v] % K;
sum += x;
for (int j = siz[u] / K; ~j; j--)
{
if ((siz[u] - j) % K == 0 || (siz[u] - j) % K == 1)
{
for (int k = 0; k <= x; k++)
{
if ((siz[v] - k) % K + (siz[u] - j) % K < K)
(g[j + k] += f[v][k] * f[u][j]) %= mod;
else if ((siz[v] - k) % K + (siz[u] - j) % K <= K + 1)
(h[j] += f[v][k] * f[u][j]) %= mod;
if ((siz[v] - k) % K + (siz[u] - j) % K <= 1)
(h[j + k] += fk[u][j] * f[v][k]) %= mod;
}
(h[j + y] += f2[v] * f[u][j]) %= mod;
}
else
{
for (int k = 0; k <= x; k++)
{
if ((siz[u] - j) % K + (siz[v] - k) % K < K)
(g[j + k] += f[v][k] * f[u][j]) %= mod;
else if ((siz[u] - j) % K + (siz[v] - k) % K <= K + 1)
(h[j + k] += f[v][k] * f[u][j]) %= mod;
}
if ((siz[u] - j) % K <= 1)
(h[j + y] += f2[v] * f[u][j]) %= mod;
}
}
siz[u] += siz[v];
for (int j = 0; j <= siz[u] / K; j++)
{
f[u][j] = g[j], g[j] = 0;
if ((siz[u] - j) % K > 1) fk[u][j] = 0;
else fk[u][j] = h[j];
h[j] = 0;
}
}
for (int i = 0; i <= siz[u] / K; i++)
{
if ((siz[u] - i) % K == 0) (f[u][i] += fk[u][i]) %= mod;
else if ((siz[u] - i) % K == 1) (f[u][i + 1] += fk[u][i]) %= mod;
if ((siz[u] - i) % K == 0) f2[u] = fk[u][i];
}
}
void work2()
{
dfs2(1, 0);
if ((n % K) * (K + 1) > n) cout << "0\n";
else cout << f[1][n % K] << "\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while (T--)
{
cin >> n >> K;
for (int i = 1; i <= n; i++) G[i].clear();
for (int i = 1; i < n; i++)
{
int u, v;
cin >> u >> v;
G[u].emplace_back(v);
G[v].emplace_back(u);
}
int bs = (int)sqrt(n);
if (K <= bs) work1();
else work2();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 11192kb
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: 14ms
memory: 18716kb
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 3 112 0 1 0 1 0 0 0 1 0 1 0 0 1 0 140 0 0 0 814 1 6 1 0 2 2 0 612 0 1 0 0 0 1 1 0 0 121 4536 0 0 1718 0 0 1 0 444 1 1908 1813 3 74 0 1 0 46 0 0 0 0 0 0 0 0 0 1 0 1 1 1 239 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 48 0 2 0 0 0 1 364 0 206 0 0 76 0 1 0 0 2 0 1 2 0 0 1 0 0 4 0 1 1 0 0 1 1 1 0 0 1 1 ...
result:
wrong answer 26th lines differ - expected: '1', found: '0'