// #pragma GCC optimize ("Ofast") // #pragma GCC optimize ("unroll-loops") // #pragma GCC target ("avx,avx2,fma") #include #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 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 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] + sz[i]; j >= 1; j --) for(int k = 1; k <= sz[i]; k ++) if(j >= k + 1) { f[x][j] += f[x][j - k] * f[i][k]; f[x][j] %= P; } sz[x] += sz[i]; } }; dfs(0, -1); cout << f[0][n - k] << '\n'; }