結果
| 問題 |
No.196 典型DP (1)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-05-17 00:17:12 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 20 ms / 2,000 ms |
| コード長 | 1,229 bytes |
| コンパイル時間 | 1,932 ms |
| コンパイル使用メモリ | 174,576 KB |
| 実行使用メモリ | 18,432 KB |
| 最終ジャッジ日時 | 2024-09-17 05:43:34 |
| 合計ジャッジ時間 | 4,091 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
constexpr int md = 1e9 + 7;
inline void mad (int &a, int b) {
a += b; if (a >= md) a -= md;
}
inline int mul (int a, int b) {
return (int)((long long)a * b % md);
}
auto convolution (
vector<int> a,
vector<int> b
) -> vector<int>
{
int l = a.size();
int m = b.size();
int n = l + m - 1;
assert(l && m);
vector<int> c(n, 0);
for (int i = 0; i < l; i++) {
for (int j = 0; j < m; j++) {
mad(c[i + j], mul(a[i], b[j]));
}
}
return c;
}
void dfs (
vector<vector<int>>& grh,
vector<int>& sz,
vector<vector<int>>& dp,
int crr = 0,
int prt = 0
) {
for (const int nxt : grh[crr]) if (nxt != prt) {
dfs(grh, sz, dp, nxt, crr);
sz[crr] += sz[nxt];
}
dp[crr] = {1};
for (const int nxt : grh[crr]) if (nxt != prt) {
dp[crr] = convolution(dp[crr], dp[nxt]);
}
dp[crr].push_back(1);
}
int main() {
int n, k;
cin >> n >> k;
vector<vector<int>> grh(n);
for (int i = 0; i < n - 1; i++) {
int s, t;
cin >> s >> t;
grh[s].push_back(t);
grh[t].push_back(s);
}
vector<int> sz(n, 1);
vector<vector<int>> dp(n);
dfs(grh, sz, dp);
cout << dp[0][k] << endl;
return 0;
}