QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#590406#7895. Graph Partitioning 2ucup-team3519WA 34ms4368kbC++174.1kb2024-09-25 23:57:262024-09-25 23:57:26

Judging History

你现在查看的是最新测评结果

  • [2024-09-25 23:57:26]
  • 评测
  • 测评结果:WA
  • 用时:34ms
  • 内存:4368kb
  • [2024-09-25 23:57:26]
  • 提交

answer

#include <bits/stdc++.h>

template <int m>
class ModInt {
    int raw_;

public:
    using mint = ModInt;
    using i64 = int64_t;

    ModInt() : raw_(0) {}
    ModInt(const auto &v) : raw_(v % m) {}

    int value() const {
        return (raw_ + m) % m;
    }

    mint &operator+=(const mint &rhs) {
        raw_ = (raw_ + rhs.raw_) % m;
        return *this;
    }
    mint &operator-=(const mint &rhs) {
        raw_ = (raw_ - rhs.raw_) % m;
        return *this;
    }
    mint &operator*=(const mint &rhs) {
        raw_ = (i64)raw_ * rhs.raw_ % m;
        return *this;
    }

    friend mint operator+(const mint &lhs, const mint &rhs) {
        return mint{lhs} += rhs;
    }
    friend mint operator-(const mint &lhs, const mint &rhs) {
        return mint{lhs} -= rhs;
    }
    friend mint operator*(const mint &lhs, const mint &rhs) {
        return mint{lhs} *= rhs;
    }
};

using mint = ModInt<998244353>;

std::vector<mint> conv(const std::vector<mint> &f, const std::vector<mint> &g,
                       int n) {
    if (f.empty() || g.empty()) {
        return {};
    }
    std::vector<mint> res(std::min<int>(n, f.size() + g.size() - 1));
    for (int i = 0; i < f.size(); ++i) {
        if (f[i].value() == 0) {
            continue;
        }
        for (int j = 0; j < g.size() && i + j < res.size(); ++j) {
            res[i + j] += f[i] * g[j];
        }
    }
    while (!res.empty() && res.back().value() == 0) {
        res.pop_back();
    }
    return res;
}

void small_k(int n, int k, const std::vector<std::vector<int>> &adj) {
    std::vector<std::vector<mint>> dp(n + 1);

    auto dfs = [&](auto self, int node, int fa) -> void {
        dp[node] = std::vector<mint>{0, 1};
        for (int to : adj[node]) {
            if (to == fa) {
                continue;
            }
            self(self, to, node);
            dp[node] = conv(dp[node], dp[to], k + 2);
        }
        if (k < dp[node].size()) {
            dp[node][0] += dp[node][k];
        }
        if (k + 1 < dp[node].size()) {
            dp[node][0] += dp[node][k + 1];
        }
    };
    dfs(dfs, 1, 0);

    if (0 < dp[1].size()) {
        std::cout << dp[1][0].value() << '\n';
    } else {
        std::cout << "0\n";
    }
}

void great_k(int n, int k, const std::vector<std::vector<int>> &adj) {
    auto [quot, rem] = div(n, k);
    if (rem > quot) {
        std::cout << "0\n";
        return;
    }

    std::vector<int> sz(n + 1);
    std::vector<std::vector<mint>> dp(n + 1);
    auto dfs = [&](auto self, int node, int fa) -> void {
        sz[node] = 1;
        dp[node] = std::vector<mint>{1};
        int used = 0;
        for (int to : adj[node]) {
            if (to == fa) {
                continue;
            }
            self(self, to, node);
            sz[node] += sz[to];
            dp[node] = conv(dp[node], dp[to], quot + 1);
            used += sz[to] / k * k;
        }

        dp[node].push_back(0);
        for (int i = dp[node].size() - 1; i >= 0; --i) {
            int comp_sz = sz[node] - i - used;
            if (comp_sz > k + 1) {
                dp[node][i] = 0;
            } else if (comp_sz == k + 1) {
                dp[node][i + 1] += dp[node][i];
            }
        }
        while (!dp[node].empty() && dp[node].back().value() == 0) {
            dp[node].pop_back();
        }
    };
    dfs(dfs, 1, 0);

    if (rem < dp[1].size()) {
        std::cout << dp[1][rem].value() << '\n';
    } else {
        std::cout << "0\n";
    }
}

void solve() {
    int n, k;
    std::cin >> n >> k;

    std::vector<std::vector<int>> adj(n + 1);
    for (int i = 1; i < n; ++i) {
        int u, v;
        std::cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    if (k + 1 < 350) {
        small_k(n, k, adj);
    } else {
        great_k(n, k, adj);
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t;
    std::cin >> t;

    while (t--) {
        solve();
    }
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3852kb

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: 34ms
memory: 4368kb

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
1
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
1
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 5509th lines differ - expected: '1', found: '0'