結果
| 問題 |
No.196 典型DP (1)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-03 21:31:59 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 2,000 ms |
| コード長 | 1,020 bytes |
| コンパイル時間 | 3,015 ms |
| コンパイル使用メモリ | 279,528 KB |
| 実行使用メモリ | 34,652 KB |
| 最終ジャッジ日時 | 2025-10-03 21:32:26 |
| 合計ジャッジ時間 | 4,742 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
// #pragma GCC optimize ("Ofast")
// #pragma GCC optimize ("unroll-loops")
// #pragma GCC target ("avx,avx2,fma")
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); i ++)
using std::cin, std::cout, std::cerr;
using ll = long long;
const int P = 1e9 + 7;
const int N = 2000 + 1;
ll f[N][N];
int sz[N];
std::vector<int> e[N];
int main() {
std::ios::sync_with_stdio(false);
int n, k; cin >> n >> k;
rep(i, 1, n - 1) {
int u, v; cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
std::function<void(int, int)> dfs = [&](int x, int p) {
sz[x] = 1;
f[x][0] = f[x][1] = 1;
for(int i : e[x]) if(i != p) {
dfs(i, x);
for(int j = sz[x]; j >= 1; j --)
for(int k = 1; k <= sz[i]; k ++) {
f[x][j + k] += f[x][j] * f[i][k];
f[x][j + k] %= P;
}
sz[x] += sz[i];
}
};
dfs(0, -1);
cout << f[0][n - k] << '\n';
}