1 条题解
-
0
自动搬运
来自洛谷,原作者为

Elegia
irony搬运于
2025-08-24 22:11:53,当前版本为作者最后更新于2019-09-11 19:25:30,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这道题改自 ProjectEuler#677。
思路要点
首先考虑无标号有根树,我们只需维护 dp 数组 即可。通过更新 dp 数组 表示此时不在意节点的根的颜色,且根的度数为 即可维护红根和蓝根, 用于维护孩子没有黄根树的,这可以帮助计算黄根。每次 update 会消耗 的时间,比如说已经计算完了 的值,那么它作为子树有可能出现了 次,则选出 种方案,令 加上 。
这一部分的复杂度为 。
计算无标号无根树的要点是观察树的一个特殊点:一颗树要么存在唯一一个重心使得任何一个子树的大小均 ,要么存在一个“重边”使得它将树恰好分为大小为 的两部分。
对于前者部分的计数,我们只需将 dp 数组计算到 时,将 数组取出。对于后者,若 是偶数,当计算完 的 dp 值时,将 用于计算即可。
如何做到更快
考虑计算 的生成函数 。
我们记 ,我们使用 Pólya 计数定理表示 个孩子的树,通过枚举置换群:
读者可自己尝试推导 和 个孩子的树。
由此我们可以通过 自身带入 这些的多项式来表示。接下来考虑如何求解。
我们让 放在一起进行迭代,我们考虑倍增,由于已经计算出了前 项,所有带入 的部分就已经确定了,我们可以认为是常数。接下来就是一个关于 的三元三次方程,这依然可以通过牛顿迭代解决,也就是这等价于根据 的定义式得到了 个它们之间的关系式 ,将 在 处泰勒展开就是一次方程,求解一个三元一次方程即可。
本算法的复杂度为 ,
常数显而易见的大,欢迎有兴趣的同学来实现。
- 1
信息
- ID
- 4552
- 时间
- 2000ms
- 内存
- 500MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者