func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long maxn = 50050;   const long long bign = 55000;   long long n, m;   long long tmp[bign], judge[bign];   long long ans, head[maxn], sz[maxn], maxp[maxn];   long long dis[bign], size;   long long q[bign], targetnum;   long long rt, tot, vis[maxn];   struct edge {     long long next, to, dis;   } e[maxn * 2];   inline void addedge(long long next, long long to, long long dis) {     e[++size].to = to;     e[size].dis = dis;     e[size].next = head[next];     head[next] = size;   }   void getzx(long long t, long long fat) {     long long i, j;     maxp[t] = sz[t] = 1;     for (i = head[t]; i; i = e[i].next) {       j = e[i].to;       if (j == fat || vis[j]) continue;       getzx(j, t);       sz[t] += sz[j];       maxp[t] = max(maxp[t], sz[j]);     }     maxp[t] = max(maxp[t], tot - sz[t]);     if (maxp[t] < maxp[rt]) rt = t;   }   inline void getdis(long long t, long long fat) {     long long i, j, k;     tmp[++tmp[0]] = dis[t];     for (i = head[t]; i; i = e[i].next) {       j = e[i].to;       k = e[i].dis;       if (j == fat || vis[j]) continue;       dis[j] = dis[t] + k;       getdis(j, t);     }   }   inline void calc(long long t) {     long long i, j, k, l, p = 0;     for (i = head[t]; i; i = e[i].next) {       j = e[i].to;       k = e[i].dis;       if (vis[j]) continue;       dis[j] = k;       tmp[0] = 0;       getdis(j, t);       for (k = tmp[0]; k; k--)         if (targetnum >= tmp[k]) ans += judge[targetnum - tmp[k]];       for (k = tmp[0]; k; k--) {         q[++p] = tmp[k];         judge[tmp[k]]++;       }     }     for (k = p; k; k--) judge[k] = 0;   }   inline void solve(long long t) {     long long i, j;     vis[t] = judge[0] = 1;     calc(t);     for (i = head[t]; i; i = e[i].next) {       j = e[i].to;       if (vis[j]) continue;       tot = sz[j];       maxp[rt = 0] = 0x3f3f3f3f;       getzx(j, 0);       solve(rt);     }   }   signed main() {     ios::sync_with_stdio(false);     register long long i, j;     cin >> n >> targetnum;     long long t1, t2;     for (i = 1; i < n; i++) {       cin >> t1 >> t2;       addedge(t1, t2, 1);       addedge(t2, t1, 1);     }     maxp[rt = 0] = 0x3f3f3f3f;     tot = n;     getzx(1, 0);     solve(rt);     cout << ans << endl;   }   