# include # include #include # include #include #include #include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include #include #include #include #include #include #include //#include using namespace std; using LL = long long; using ULL = unsigned long long; long long MOD = 1000000000 + 7; //924844033 1000000000 + 9; constexpr long long INF = numeric_limits::max(); const double PI = acos(-1); #define fir first #define sec second #define thi third #define debug(x) cerr<<#x<<": "< Pll; typedef pair Dll; typedef pair> Ppll; typedef pair>> Pbll; typedef pair>> Pvll; typedef pair Vec2; struct Tll { LL first, second, third; }; struct Fll { LL first, second, third, fourth; }; typedef pair Ptll; #define rep(i,rept) for(LL i=0;i=0;i--) LL h, w, n, m, k, t, s, p, q, last, first, cnt, sum, ans,dp[3000][3000], a[330020], b[330000],sub[3000]; string str, ss; bool f[220000]; char c[4000][4000]; int di[4][2] = { { 0,1 },{ 1,0 },{ 0,-1 },{ -1,0 } }; struct Edge { LL to, cost; }; struct edge { LL from, to, cost; }; vector>vec,rvec; vectored; vectorv; mapma; setst; void YN(bool f) { if (f) cout << "YES" << endl; else cout << "NO" << endl; } void yn(bool f) { if (f) cout << "Yes" << endl; else cout << "No" << endl; } void sub_cnt(int cur,int par) { rep(i, vec[cur].size()) { if (vec[cur][i].to == par)continue; sub_cnt(vec[cur][i].to, cur); sub[cur] += sub[vec[cur][i].to]; } sub[cur]++; } void dfs(int cur,int par) { rep(i, vec[cur].size()) { LL v = vec[cur][i].to; if (v == par)continue; dfs(v,cur); vectortable(sub[cur]+1, 0); rep(j, sub[cur] - sub[v]) rep(l, sub[v] + 1) (table[j + l] += dp[cur][j] * dp[v][l]) %= MOD; rep(j, sub[cur])dp[cur][j] = table[j]; } dp[cur][sub[cur]] = 1; } int main() { cin >> n >> k; vec.resize(n); rep(i, n-1) { LL x, y; cin >> x >> y; vec[x].push_back(Edge{ y,0 }); vec[y].push_back(Edge{ x,0 }); } sub_cnt(0, -1); rep(i, n)dp[i][0] = 1; dfs(0,-1); cout << dp[0][k] << endl; return 0; }