Luogu5206 [WC2019] 数树

题意:对于两棵 个点的有标号无根树 ,定义 (边取交集)的连通块个数。

  • 子任务一:给出 和常数 ,求
  • 子任务二:给出 和常数 ,求
  • 子任务三:给出 ,求

答案对 取模,,时限


子任务一(给出

题意理解分,直接 std::map 送走。

子任务二(给出

为两者边交集的大小,则 ,贡献形如

为了方便,我们忽略 并令 ,这样就把贡献改写成

也就是说,我们希望求出 套用子集反演可得: 其中 ,即在边集 的基础上继续连边,能得到的树的种类数。

  • 定理 将图连成了 个联通块,大小为 ,则继续连边的方案数是

证明:在 的基础上继续连边,可以视作将已有的联通快缩点,再建立一棵 个节点的树。若在联通块 之间连边,方案数为 ,记联通快的度数为 ,则连边方案数为

贡献和度数有关,考虑枚举全体 prufer 序列 ,则 后面的部分恰是多项式定理 ,即


代回原式: 注意其中的 (连通块个数)是和 对应的。

前面的系数按下不表,后面的意思是:令 ,大小为 的联通块乘积贡献是 ,求所有连通块贡献之积。


考虑 DP:

  • 的子树中选取一个边的子集,和 连通的分量大小为 ,未计入,其余部分已计入的贡献和。

  • 的子树中选取一个边的子集的贡献和。

加入分支 时,讨论选不选边 ,有转移: 这是个树上背包,子树大小剪枝可做到 ,无法通过。若要用 FFT 优化,复杂度可能是 且很难写。

事实上,状态可以缩减。注意到我们最后只取 作为答案,可以不维护整个

把转移表示成幂级数,设 则有 (似乎更好懂了)

考虑加入一个分支 带来的变化。记旧的 因此,只需维护 就能转移。(最终我们只需要

复杂度 。(听说这个 DP 有一个优美的组合意义)

子任务三( 均任取)

接续子任务二的结论 其中 是由 生成的连通块大小。

该式的组合意义是 SET 变换,大小为 的的连通块权值是 ,多项式 exp 即可。复杂度