#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define repeat(i,n) for (long long i = 0; (i) < (n); ++ (i)) #define debug(x) cerr << #x << ": " << x << '\n' #define debugArray(x,n) for(long long i = 0; (i) < (n); ++ (i)) cerr << #x << "[" << i << "]: " << x[i] << '\n' #define debugArrayP(x,n) for(long long i = 0; (i) < (n); ++ (i)) cerr << #x << "[" << i << "]: " << x[i].first<< " " << x[i].second << '\n' using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair Pii; typedef vector vint; typedef vector vll; const ll INF = INT_MAX; const ll MOD = 1e9+7; int N,K; vector G; ll dp[2010][2010]; ll tmp[2010]; ll size[2010]; void dfs(int v,int par){ size[v]=1; dp[v][0]=1; for(int chi:G[v])if(chi!=par){ dfs(chi,v); size[v]+=size[chi]; fill(tmp,tmp+K+1,0); for(int k=K;k>=0;k--){ repeat(l,k+1){ tmp[k] = (tmp[k]+dp[v][k-l]*dp[chi][l]%MOD)%MOD; } } swap(tmp,dp[v]); } if(size[v]<=K){ dp[v][size[v]]=1; } } int main(){ cin.tie(0); ios::sync_with_stdio(false); cin>>N>>K; G.resize(N); repeat(i,N-1){ int a,b;cin>>a>>b; G[a].push_back(b); G[b].push_back(a); } dfs(0,-1); //debug(dp[3][1]); cout << dp[0][K] << endl; return 0; }