如题,楼主在优化的时候优化成了这样一个样子,抱着试试看的态度提交了
void dp(int u, int fa) {
vector <node> son;
son.push_back(node(-1, -1));
for(int i = 0; i < gra[u].size(); i++) {
int v = gra[u][i].to;
if(v == fa) continue;
dp(v, u);
son.push_back(gra[u][i]);
}
int lim = son.size() - 1, r = 1;
g[0][1] = 1;
for(int i = 1; i <= lim; i++) {
int v = son[i].to;
bool fg = son[i].flag;
for(int j = 1; j <= r + siz[v]; j++) {
g[i][j] = 0;
for(int k1 = 1; k1 <= min(j, r); k1++) {
int L, R;
if(!fg) L = 1, R = j - k1;
else L = j - k1 + 1, R = siz[v];
upd(g[i][j], C[j - 1][k1 - 1] * C[siz[v] + r - j][r - k1] % Mod * g[i - 1][k1] % Mod * ((hf[v][R] - hf[v][L - 1]) % Mod + Mod) % Mod);
}
}
r += siz[v];
}
for(int i = 1; i <= r; i++) {
f[u][i] = g[lim][i];
hf[u][i] = (hf[u][i - 1] + g[lim][i]) % Mod;
}
}
显然,从任何角度看这个做法时间复杂度都是假的,将树构造成一条链就是 O(n3),但是它惊喜的通过了所有的测试点,令人忍俊不禁。
因为这是省选真题所以大概率不会加强数据 qwq 但是还是希望在讨论区里面给厚仁看个乐子。