func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e6 + 17;   vector<int> adj[N];   int n, k;   int cnt[N];   bool mark[N];   long long int ans = 0;   int findCentroid(int v, int n, int &ans, int par = -1) {     int sum = 1;     int mx = 0;     for (int u : adj[v]) {       if (u != par && !mark[u]) {         int x = findCentroid(u, n, ans, v);         sum += x;         mx = max(mx, x);       }     }     mx = max(mx, n - sum);     if (mx <= n / 2) {       ans = v;     }     return sum;   }   int getSubTreeSize(int v, int par = -1) {     int res = 1;     for (int u : adj[v]) {       if (par != u && !mark[u]) {         res += getSubTreeSize(u, v);       }     }     return res;   }   void addToCnt(int v, int plus, int depth = 1, int par = -1) {     if (depth > k) return;     cnt[depth] += plus;     for (int u : adj[v]) {       if (u != par && !mark[u]) {         addToCnt(u, plus, depth + 1, v);       }     }   }   void findMiddleCentroidPaths(int v, int depth = 1, int par = -1) {     if (k - depth >= 0) ans += cnt[k - depth];     for (int u : adj[v]) {       if (u != par && !mark[u]) {         findMiddleCentroidPaths(u, depth + 1, v);       }     }   }   void findBeginCentroidPaths(int v, int depth = 0, int par = -1) {     if (depth == k) {       ans++;       return;     }     for (int u : adj[v]) {       if (u != par && !mark[u]) {         findBeginCentroidPaths(u, depth + 1, v);       }     }   }   void centroidDecomposition(int root, int siz) {     int centroid;     findCentroid(root, siz, centroid);     mark[centroid] = true;     findBeginCentroidPaths(centroid);     for (int v : adj[centroid]) {       if (mark[v]) continue;       findMiddleCentroidPaths(v);       addToCnt(v, +1);     }     for (int v : adj[centroid]) {       if (mark[v]) continue;       addToCnt(v, -1);     }     for (int v : adj[centroid]) {       if (!mark[v]) {         centroidDecomposition(v, getSubTreeSize(v));       }     }     mark[centroid] = false;   }   int main() {     cin >> n >> k;     for (int i = 1; i < n; i++) {       int u, v;       cin >> u >> v;       u--;       v--;       adj[v].push_back(u);       adj[u].push_back(v);     }     centroidDecomposition(0, n);     cout << ans;   }   