第一遍自己写的 10pts
这一遍和的题解,但还是10 pts,且和第一遍正确性无区别
#include"bits/stdc++.h"
// #define int long long
typedef long long ll;
using namespace std;
const ll N=1e5+100,mod=1e9+7;
int n,k;
vector<int> a[N];
int siz[N];
int d[N][109][2][2];//是否放置,是否标记
int t[109][2][2];
int add(int x,ll y)
{
y%=mod;
y+=x;
y%=mod;
return y;
}
void dfs(int x,int f)
{
siz[x]=d[x][0][0][0]=d[x][1][1][0]=1;
for(auto v:a[x])
{
if(v==f)continue;
dfs(v,x);
for(int i=0;i<=siz[x]&&i<=k;i++)
{
t[i][0][0]=d[x][i][0][0],d[x][i][0][0]=0;
t[i][0][1]=d[x][i][0][1],d[x][i][0][1]=0;
t[i][1][0]=d[x][i][1][0],d[x][i][1][0]=0;
t[i][1][1]=d[x][i][1][1],d[x][i][1][1]=0;
}
for(int i=0;i<=siz[x]&&i<=k;i++)
{
for(int j=0;j<=siz[i]&&j+i<=k;j++)
{
d[x][i+j][0][0]=add(d[x][i+j][0][0],1ll*t[i][0][0]*d[v][j][0][1]);
d[x][i+j][0][1]=add(d[x][i+j][0][1],1ll*t[i][0][1]*(d[v][j][0][1]+d[v][j][1][1]));
d[x][i+j][0][1]=add(d[x][i+j][0][1],1ll*t[i][0][0]*d[v][j][1][1]);
d[x][i+j][1][0]=add(d[x][i+j][1][0],1ll*t[i][1][0]*(d[v][j][0][0]+d[v][j][0][1]));
d[x][i+j][1][1]=add(d[x][i+j][1][1],1ll*t[i][1][0]*(d[v][j][1][0]+d[v][j][1][1]));
d[x][i+j][1][1]=add(d[x][i+j][1][1],1ll*t[i][1][1]*(1ll*d[v][j][0][0]+d[v][j][0][1]+d[v][j][1][0]+d[v][j][1][1]));
}
}
siz[x]+=siz[v];
}
}
signed main()
{
cin>>n>>k;
int x,y;
for(int i=1;i<n;i++)
{
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
dfs(1,0);
cout<<(1ll*d[1][k][0][1]+d[1][k][1][1])%mod;
}