結果
問題 | No.1614 Majority Painting on Tree |
ユーザー |
![]() |
提出日時 | 2021-07-21 22:57:00 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,935 ms / 5,000 ms |
コード長 | 2,329 bytes |
コンパイル時間 | 2,070 ms |
コンパイル使用メモリ | 183,660 KB |
実行使用メモリ | 14,936 KB |
最終ジャッジ日時 | 2024-07-17 20:04:09 |
合計ジャッジ時間 | 26,747 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 45 |
ソースコード
#include <bits/stdc++.h>using namespace std;const long long MOD = 998244353;long long modpow(long long a, long long b){long long ans = 1;while (b > 0){if (b % 2 == 1){ans *= a;ans %= MOD;}a *= a;a %= MOD;b /= 2;}return ans;}long long modinv(long long a){return modpow(a, MOD - 2);}vector<long long> mf = {1};vector<long long> mfi = {1};long long modfact(int n){if (mf.size() > n){return mf[n];} else {for (int i = mf.size(); i <= n; i++){long long next = mf.back() * i % MOD;mf.push_back(next);mfi.push_back(modinv(next));}return mf[n];}}long long modfactinv(int n){if (mfi.size() > n){return mfi[n];} else {return modinv(modfact(n));}}long long modbinom(int n, int k){if (n < 0 || k < 0 || k > n){return 0;} else {return modfact(n) * modfactinv(k) % MOD * modfactinv(n - k) % MOD;}}int main(){int N, C;cin >> N >> C;vector<vector<int>> E(N);for (int i = 0; i < N - 1; i++){int A, B;cin >> A >> B;A--;B--;E[A].push_back(B);E[B].push_back(A);}vector<int> p(N, -1);vector<vector<int>> c(N);queue<int> Q;Q.push(0);vector<int> bfs;while (!Q.empty()){int v = Q.front();Q.pop();bfs.push_back(v);for (int w : E[v]){if (w != p[v]){p[w] = v;c[v].push_back(w);Q.push(w);}}}reverse(bfs.begin(), bfs.end());long long ans = 0;for (int i = C; i >= 1; i--){vector<long long> dp(N);for (int v : bfs){int d = c[v].size();dp[v] = modpow(i, d);if (v == 0){for (int j = (d + 2) / 2; j < d; j++){dp[v] += MOD - modbinom(d, j) * modpow(i - 1, d - j) % MOD * i % MOD;}} else {for (int j = (d + 1) / 2; j < d; j++){dp[v] += MOD - modbinom(d, j) * modpow(i - 1, d - j) % MOD;}for (int j = (d + 3) / 2; j <= d; j++){dp[v] += MOD - modbinom(d, j) * modpow(i - 1, d - j) % MOD * (i - 1) % MOD;}}dp[v] %= MOD;for (int w : c[v]){dp[v] *= dp[w];dp[v] %= MOD;}}if ((C - i) % 2 == 0){ans += dp[0] * modbinom(C, i) % MOD;} else {ans += MOD - dp[0] * modbinom(C, i) % MOD;}}ans %= MOD;cout << ans << endl;}