loading...

[ARC101E]Ribbons on Tree

容斥的题还是做少了

链接

Description

给定 \(n\) 个点的树,求满足如下条件的,选出 \(\dfrac{n}{2}\) 对点对 \(u,v\),满足对于每对点对之间的路径上的边染色后整棵树无一条边未染色的方案数。

\(n \le 5000\)

Solution

暴力 DP 不说了。

考虑容斥,钦定让 \(k\) 条边未被染色,则原树被分为 \(k+1\) 个连通块,每个连通块之间独立。因为是钦定(这里其实是至少),连通块里面随便取点对都是可以的。

在一个大小为 \(2n\) 的连通块内随机取点对的方案数显然为 \(\prod _{i=1}^n(2i-1)\),令其为 \(g(2n)\)。令钦定 \(k\) 条边染色的方案数为 \(p(k)\),答案即为 \(\sum (-1)^kp(k)\)

\(f_{u,i}\) 表示考虑到 \(u\) 子树,且 \(u\) 所在连通块大小为 \(i\) 对答案的贡献。边界,初始让 \(f_{u,1}=1\)

现在考虑 \(u\)\(v\) 如何合并。

合并一:让 \(v\) 所在连通块自行连边,新 \(f_{u,i}\) 减去 \(g(j)\times f_{v,j}\ \times\) 旧的\(f_{u,i}\)。“减去”是因为增加一条钦定断掉的边,需要对答案的贡献正负取反。

合并二:让 \(v\) 所在连通块与 \(u\) 所在连通块合并,新 \(f_{u,i+j}\) 加上 \(f_{u,i}\ \times\) 旧的 \(f_{v,j}\)

统计答案时枚举根节点所在连通块的大小,加入答案即可。\(\mathrm{ans} = \sum f_{1,i}\times g(i)\)

综上得出代码

posted @ 2025-04-15 22:15  goldspade  阅读(15)  评论(0)    收藏  举报