void dfs(int x){
siz[x] = 1;
for(int i = 1; i <= k; ++i) dp[x][0][i] = 1;
for(auto v : ver[x]){
if(v == fa[x]) continue;
fa[v] = x;
dfs(v);
for(int i = 0; i <= (siz[x] - 1) * k; ++i)
for(int j = 0; j <= k; ++j)
f[i][j] = dp[x][i][j],
dp[x][i][j] = 0;
for(int i = 0; i <= (siz[x] - 1) * k; ++i)
for(int j = 0; j <= k; ++j)
if(f[i][j])
for(int ii = 0; ii <= (siz[v] - 1) * k; ++ii)
for(int jj = 0; jj <= k; ++jj){
if(!dp[v][ii][jj]) continue;
node t = merge(i, j, ii, jj);
dp[x][t.a][t.b] = add(dp[x][t.a][t.b], mul(f[i][j], dp[v][ii][jj]));
}
siz[x] += siz[v];
}
return ;
}