如题。
我本来是这么写的
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5, M = 1e2, Mod = 1e9 + 7;
vector <int> gra[N + 10];
int f[N + 10][M + 10][2][2], siz[N + 10], n, m;
int tmp[N + 10][M + 10][2][2];
void prepare(int u, int fa) {
siz[u] = 1;
for(int p = 0; p < gra[u].size(); p++) {
int v = gra[u][p];
if(v == fa) continue;
prepare(v, u);
siz[u] += siz[v];
}
}
void add(int &x, int y) {x = (x + y) % Mod;}
void dfs(int u, int fa) {
int lim = 1, child = 0;
f[u][1][1][0] = 1;
f[u][0][0][0] = 1;
for(int p = 0; p < gra[u].size(); p++) {
int v = gra[u][p];
if(v == fa) continue;
dfs(v, u);
child++;
for(int i = 0; i <= m; i++) {
tmp[u][i][0][0] = f[u][i][0][0];
tmp[u][i][0][1] = f[u][i][0][1];
tmp[u][i][1][0] = f[u][i][1][0];
tmp[u][i][1][1] = f[u][i][1][1];
}
for(int k = 0; k <= min(lim, m); k++) {
for(int x = 0; x <= min(siz[v], m - k); x++) {
add(tmp[u][k + x][0][0], (f[u][k][0][0] * f[v][x][0][1]));
add(tmp[u][k + x][1][0], (f[u][k][1][0] * (f[v][x][0][1] + f[v][x][0][0])));
add(tmp[u][k + x][0][1], (f[u][k][0][0] * f[v][x][1][1] + f[u][k][0][1] * (f[v][x][1][1] + f[v][x][0][1])));
add(tmp[u][k + x][1][1], (f[u][k][1][0] * (f[v][x][1][0] + f[v][x][1][1]) +
f[u][k][1][1] * (f[v][x][1][1] + f[v][x][1][0] + f[v][x][0][1] + f[v][x][0][0])));
}
}
for(int i = 0; i <= m; i++) {
f[u][i][0][0] = tmp[u][i][0][0];
f[u][i][0][1] = tmp[u][i][0][1];
f[u][i][1][0] = tmp[u][i][1][0];
f[u][i][1][1] = tmp[u][i][1][1];
}
}
}
int main() {
cin >> n >> m;
for(int p = 1, x, y; p < n; p++) {
cin >> x >> y;
gra[x].push_back(y);
gra[y].push_back(x);
}
prepare(1, 0);
dfs(1, 0);
cout << (f[1][m][0][1] + f[1][m][1][1]) << endl;
}
这里面的 tmp 代表的是合并完第 i 个儿子后的值。然后我发现我的样例 WA 掉了,怎么调也调不对,然后去剽题解去了 QAQ改成了酱紫
for(int i = 0; i <= min(lim, m); i++) {
tmp[u][i][0][0] = f[u][i][0][0], f[u][i][0][0] = 0;
tmp[u][i][0][1] = f[u][i][0][1], f[u][i][0][1] = 0;
tmp[u][i][1][0] = f[u][i][1][0], f[u][i][1][0] = 0;
tmp[u][i][1][1] = f[u][i][1][1], f[u][i][1][1] = 0;
}
for(int k = 0; k <= min(lim, m); k++) {
for(int x = 0; x <= min(siz[v], m - k); x++) {
add(f[u][k + x][0][0], 1ll * tmp[u][k][0][0] * 1ll * f[v][x][0][1] % Mod);
add(f[u][k + x][1][0], 1ll * tmp[u][k][1][0] * (1ll * f[v][x][0][1] + 1ll * f[v][x][0][0]) % Mod);
add(f[u][k + x][0][1], (1ll * tmp[u][k][0][0] * 1ll * f[v][x][1][1] + 1ll * tmp[u][k][0][1] * (1ll * f[v][x][1][1] + 1ll * f[v][x][0][1])) % Mod);
add(f[u][k + x][1][1], 1ll * tmp[u][k][1][0] * 1ll * (1ll * f[v][x][1][0] + 1ll * f[v][x][1][1]) % Mod);
add(f[u][k + x][1][1], 1ll * tmp[u][k][1][1] * 1ll * (1ll * f[v][x][1][1] + 1ll * f[v][x][1][0] + 1ll * f[v][x][0][1] + 1ll * f[v][x][0][0]));
}
}
就过了,不是很理解 QAQ 求巨佬指教 QAQ