#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include <cstdio>
#include <vector>
#define gc IO::fastgc()
#define pc(c) IO::fastpc(c)
typedef long long ll;
typedef long long unsigned llu,ull;
namespace IO{
char ibuf[1<<23],obuf[1<<23],*ip1=ibuf,*ip2=ibuf,*o=obuf;
inline char fastgc(){
return ((ip1==ip2)&&(ip2=(ip1=ibuf)+fread(ibuf,1,1<<21,stdin),ip1==ip2)?EOF:*ip1++);
}
inline void fastpc(char c){
*(o++)=c;
}
inline ll read(){
ll t=0,f=1;
char c=gc;
while(c!='-'&&(c<'0'||c>'9')) c=gc;
if(c=='-') c=gc,f=-1;
while(c>='0'&&c<='9') t=10*t+(c^48),c=gc;
return f*t;
}
inline void write(ll x){
if(!x) return (void)pc('0');
if(x<0) pc('-'),x=-x;
static char c[33]={""};
static int cc=0;
while(x) c[++cc]=x%10,x/=10;
while(cc) pc(c[cc--]|48);
}
inline void flush(){
fwrite(obuf,o-obuf,1,stdout);
}
struct IO_Flusher{
inline IO_Flusher(){}
inline ~IO_Flusher(){
flush();
}
}__io_flusher_;
}
using IO::read;
using IO::write;
constexpr unsigned N=5007,M=10007;
constexpr int P=998244353;
int n,kk;
int f[N][N];
int dep[N],dpst[N];
std::vector<int> g[N];
inline void adde(int u,int v){
g[u].emplace_back(v),
g[v].emplace_back(u);
}
#define add(buf,v) buf=(1ll*buf+v)%P
inline ll imx(ll a,ll b){
return a>b?a:b;
}
inline int imx(int a,int b){
return a>b?a:b;
}
void dfs(int u,int fa){
static int ff[N];
dep[u]=dep[fa]+1;
f[u][0]=1ll;
int dmx=dep[u];
for(int v:g[u]){
if(v==fa) continue;
dfs(v,u);
dmx=imx(dmx,dpst[v]);
for(int j=0;j<=dmx-dep[u];++j){
ff[j]=0;
}
for(int j=0;j<=kk;++j){
for(int k=0;k<=dpst[v]-dep[u];++k){
add(ff[j],1ll*f[u][j]*f[v][k]%P);
if(j+k+1<=kk){
add(ff[imx(j+0,k+1)],1ll*f[u][j]*f[v][k]%P);
}
}
}
for(int j=0;j<=dmx-dep[u];++j){
f[u][j]=ff[j];
}
}
dpst[u]=dmx;
}
signed main(){
n=read(),kk=read();
for(int i=1;i<n;++i){
int u=read(),v=read();
adde(u,v);
}
dfs(1,0);
ll ans=0;
for(int i=0;i<=kk;++i){
ans=(ans+f[1][i])%P;
}
write(ans);
return 0;
}
我觉得已经改得和第三篇题解特别像了,不知道为什么不对。