#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
inline int read(){
int f(1),x(0);
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f*x;
}
inline void Write(int x){
if(x>9) Write(x/10);
putchar(x%10+48);
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
Write(x);
putchar('\n');
}
}
using namespace Testify;
int n,k;
const int N=50005;
int head[N],nxt[N<<1],to[N<<1],val[N<<1],tot(0);
inline void add(int x,int y){
to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
int SATELLITE(0);
int root,sum;
bool vis[N];
int siz[N],maxn[N];
inline void getroot(int now,int fa){
siz[now]=1;
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(y==fa||vis[y]) continue;
getroot(y,now);
siz[now]+=siz[y];
maxn[now]=max(maxn[now],siz[y]);
}
maxn[now]=max(maxn[now],sum-siz[now]);
if(maxn[now]<maxn[root]){
root=now;
}
}
int beyond[N],past[N];
inline void getdis(int now,int fa,int dis){
if(dis>k) return;
beyond[dis]++;
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(y==fa||vis[y]) continue;
getdis(y,now,dis+1);
}
}
inline void calc(int now){
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(vis[y]) continue;
getdis(y,now,1);
SATELLITE+=beyond[k];
for(register int i=1;i<k;i++){
SATELLITE+=(beyond[i]*past[k-i]);
}
for(register int i=1;i<=k;i++){
past[i]+=beyond[i];
beyond[i]=0;
}
}
for(register int i=1;i<=k;i++){
past[i]=0;
}
}
inline void solve(int now){
vis[now]=true;
calc(now);
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(vis[y]) continue;
maxn[root=0]=LONG_LONG_MAX;
sum=siz[y];
getroot(y,0);
solve(root);
}
}
signed main(void){
n=read(),k=read();
for(register int i=1;i<n;i++){
register int asd=read(),jkl=read();
add(asd,jkl),add(jkl,asd);
}
maxn[root=0]=LONG_LONG_MAX;
sum=n;
getroot(1,0);
solve(root);
write(SATELLITE);
return 0;
}
感觉是calc的问题,但是不知道怎么改,求助呜呜呜呜呜 

