[做题记录-计数] Luogu P5333 [JSOI2019]神经网络
设\(f_i\)表示这棵树拆出\(i\)条链的方案数。
枚举链的个数为下表构造\(EGF\)可得:
\[F = \sum_{i = 1} f_ii!\sum_{j = 1}^{i}\binom{i - 1}{j - 1}(-1) ^ {i - j}\frac{x^j}{j!}
\]
这部分是任意树的\(EGF\), 现在考虑怎么把第一棵树的第一个点丢最前面, 那么钦定这条链在前面就好了。针对第一棵树构造下面的东西:
\[F = \sum_{i = 1} f_i(i - 1) !\sum_{j = 1}^{i}\binom{i - 1}{j - 1}(-1) ^ {i - j}\frac{x^{j - 1}}{(j - 1)!}
\]
然后减去最后一条链也是来自第一棵树的方案。
\[F = \sum_{i = 1} f_i(i - 1) !\sum_{j = 2}^{i}\binom{i - 1}{j - 1}(-1) ^ {i - j}\frac{x^{j - 2}}{(j - 2)!}
\]
参加内部标号, 但是不参与全体链的排列。
然后你发现这个树dp真tm恶心
以前一直搞最优化所以重复转移没啥事, 这次终于被计数制裁了
考虑设\(dp_{x, i, 0/1/2}\)表示\(x\)点拼了\(j\)条链, \(x\)点现在拼好了/是单点/是链的方案数。
我们钦定链的形成只在每条边去决策, 保证计数不重复。
诶其实发现还好, 是自己sb了
/* 00 */
pls(g[i + j][0], 1ll * dp[x][i][0] * dp[y][j][0] % P);
/* 012 */
pls(g[i + j + 1][0], 1ll * dp[x][i][0] * dp[y][j][1] % P);
pls(g[i + j + 1][0], 2ll * dp[x][i][0] * dp[y][j][2] % P);
/* 10 */
pls(g[i + j][1], 1ll * dp[x][i][1] * dp[y][j][0] % P);
/* 11 */
pls(g[i + j][2], 1ll * dp[x][i][1] * dp[y][j][1] % P);
pls(g[i + j + 1][1], 1ll * dp[x][i][1] * dp[y][j][1] % P);
/* 12 */
pls(g[i + j + 1][1], 2ll * dp[x][i][1] * dp[y][j][2] % P);
pls(g[i + j][2], 1ll * dp[x][i][1] * dp[y][j][2] % P);
/* 20 */
pls(g[i + j][2], 1ll * dp[x][i][2] * dp[y][j][0] % P);
/* 21 */
pls(g[i + j + 1][0], 2ll * dp[x][i][2] * dp[y][j][1] % P);
pls(g[i + j + 1][2], 1ll * dp[x][i][2] * dp[y][j][1] % P);
/* 22 */
pls(g[i + j + 1][0], 2ll * dp[x][i][2] * dp[y][j][2] % P);
pls(g[i + j + 1][2], 2ll * dp[x][i][2] * dp[y][j][2] % P);