【题解】JSOI 2019 神经网络
意思就是将每棵树树剖成若干条链,然后将链组合在一起的方案数。
枚举一种方案 \(\{b_1,b_2,\cdots,b_m\}\) 表示最终每个树剖出来的链的个数,然后组合方案数的计算是经典容斥。因为同一棵树中的链不能放在相邻的位置,不需要考虑本就不在考虑范围之内的 "同一棵树中的两条链在最终方案中拼合在一起的方案数",所以容斥之后计算出来的就是 \(\{b_1,b_2,\cdots,b_m\}\) 对应的方案数。
事实上这让我们想到了 "青春猪头少年不会梦到兔女郎学姐" 一题。具体地,令 \(g_{i,j}\) 表示最终第 \(i\) 棵树剖出 \(j\) 条链的方案数,答案为:
\[\begin{aligned}
ans=&\sum_{b}\left(\prod_{i=1}^{m}g_{i,b_i}b_i!\right)\left(\sum_{c,c_i\leq b_i}\left(\sum c_i\right)!\prod_{i=1}^{n}{b_i-1\choose c_i-1}\frac{(-1)^{b_i-c_i}}{\prod c_i!}\right)\\
=&\sum_{c}\left(\sum c_i\right)!\prod_{i=1}^{m}\left(\sum_{b,b_i\geq c_i}{b_i-1\choose c_i-1}\frac{(-1)^{b_i-c_i}}{ c_i!}g_{i,b_i}b_i!\right)\\
\end{aligned}
\]
后面一块可以写成若干多项式的卷积:
\[F_i(x)=\sum_{c_i=0}^{k_i}x^{c_i}\sum_{b,b_i\geq c_i}{b_i-1\choose c_i-1}\frac{(-1)^{b_i-c_i}}{c_i!}g_{i,b_i}b_i!\\
\Rightarrow ans=\sum_{t=0}^{\sum k}t![x^t]\prod_{i=1}^{m}F_i(x)
\]
此时考虑 \(F_1(x)\) 的特殊性。因为 \(1\) 节点所在的链必须在所有链之前:
\[F_1(x)=\sum_{b_1=1}^{k_1}g_{i,b_1}(b_1-1)!\sum_{c_1=1}^{b_1}x^{c_1-1}{b_1-1\choose c_1-1}\frac{(-1)^{b_1-c_1}}{(c_1-1)!}\\
\]
然后减去首尾都是 \(1\) 号树的链的情况:
\[F_1'(x)=\sum_{b_1=1}^{k_1}g_{i,b_1}(b_1-1)!\sum_{c_1=2}^{b_1}x^{c_1-2}{b_1-1\choose c_1-1}\frac{(-1)^{b_1-c_1}}{(c_1-2)!}\\
\]
上面这两行大概比较重要?后面暴力卷积的复杂度是 \((\sum k)^2\) 的。
最后 dp 求解 \(g_{i,j}\) 即可:令 \(h_{u,i,0/1/2}\) 表示 \(u\) 子树内有 \(i\) 条链,\(u\) 联通了 \(0/1/2\) 个儿子节点的方案数,记得考虑链的方向,直接转移即可,和 "林克卡特树" 那题一样。