structEdge { int to, nt; Edge() {} Edge(int to, int nt) : to(to), nt(nt) {} }e[N << 1]; int hd[N], cnte; inlinevoidAddEdge(int u, int v){ e[++cnte] = Edge(v, hd[u]); hd[u] = cnte; }
int n, k;
ll dp[N][510];
inlinevoidInput(){ read(n, k); int u, v; for(int i = 1; i < n; i++) { read(u, v); AddEdge(u, v); AddEdge(v, u); } }
inlinevoidDfs(int u, int fa){ dp[u][0] = 1; for(int i = 1; i <= k; i++) { dp[u][i] = 0; } for(int i = hd[u]; i ; i = e[i].nt) { int v = e[i].to; if(v == fa) continue; Dfs(v, u); for(int j = 1; j <= k; j++) { dp[u][j] += dp[v][j - 1]; } } }
inlinevoidGet(int u, int fa){ for(int i = hd[u]; i ; i = e[i].nt) { int v = e[i].to; if(v == fa) continue; for(int j = k; j >= 1; j--) { dp[v][j] += dp[u][j - 1]; if(j >= 2) { dp[v][j] -= dp[v][j - 2]; } } Get(v, u); } }
inlinevoidWork(){ Dfs(1, 0); // for(int i = 1; i <= n; i++) { // cout << dp[i][k] << endl; // } Get(1, 0); ll ans = 0; for(int i = 1; i <= n; i++) { ans += dp[i][k]; } printf("%lld", ans / 2); }
intmain(){ int T = 1; while(T--) { Input(); Work(); } return0; }