Loading

【题解】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\) 个儿子节点的方案数,记得考虑链的方向,直接转移即可,和 "林克卡特树" 那题一样。

代码:记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @ 2021-09-23 16:56  Qiuly  阅读(78)  评论(0编辑  收藏  举报