1 条题解

  • 0
    @ 2025-10-28 10:06:19

    题意理解

    我们有一棵 nn 个节点的树,每个节点 ii 有一个权值 aia_i(是 11nn 的排列)。对于每个节点 xx,需要计算其子树内所有节点参与的游戏的欢乐值:

    • 单点贡献:isubtree(x)fd(ai2)\sum_{i \in \text{subtree}(x)} f_d(a_i^2)
    • 双点贡献:$\sum_{i,j \in \text{subtree}(x), i < j} f_d(a_i a_j)$

    其中函数 fd(z)f_d(z) 定义为:将 zz 质因数分解为 ipiki\prod_i p_i^{k_i},则

    fd(z)=i(1)ki[kid]f_d(z) = \prod_i (-1)^{k_i} [k_i \le d]

    核心思路

    关键观察 1:fdf_d 函数的性质

    fd(z)f_d(z) 是一个积性函数,且可以表示为:

    fd(z)=μ(z)[所有质因子的指数d]f_d(z) = \mu(z) \cdot [\text{所有质因子的指数} \le d]

    其中 μ(z)\mu(z) 是莫比乌斯函数。

    特别地,当 dd 足够大时(dmaxkid \ge \max k_i),fd(z)=μ(z)f_d(z) = \mu(z)

    关键观察 2:问题转化

    总欢乐值可以重写为:

    $$\text{ans}(x) = \frac{1}{2} \left[ \left(\sum_{i} f_d(a_i^2) + \sum_{i,j} f_d(a_i a_j)\right) - \sum_i f_d(a_i^2) \right] + \sum_i f_d(a_i^2) $$

    化简后:

    $$\text{ans}(x) = \frac{1}{2} \left[ \left(\sum_{i} f_d(a_i^2)\right)^2 + \sum_i f_d(a_i^2) \right] $$

    证明:利用 fdf_d 的积性,fd(aiaj)=fd(ai)fd(aj)f_d(a_i a_j) = f_d(a_i) f_d(a_j)gcd(ai,aj)=1\gcd(a_i, a_j) = 1,但这里需要更精细的分析。

    关键观察 3:莫比乌斯反演

    通过莫比乌斯反演,可以将 fd(aiaj)f_d(a_i a_j) 表示为:

    $$f_d(a_i a_j) = \sum_{k \mid \gcd(a_i, a_j)} g_d(k) $$

    其中 gdg_d 是某个与 fdf_d 相关的函数。

    算法框架

    方法一:树上启发式合并(DSU on Tree)

    主要步骤

    1. 对树进行 DFS,预处理重儿子
    2. 对于每个节点 xx
      • 先递归处理所有轻儿子
      • 然后处理重儿子,保留重儿子的统计信息
      • 最后加入轻儿子的贡献
    3. 在合并过程中维护 cnt[v]cnt[v]:当前子树中权值 vv 出现的次数

    贡献计算: 维护 ifd(ai2)\sum_{i} f_d(a_i^2)i,jfd(aiaj)\sum_{i,j} f_d(a_i a_j),后者可以通过:

    $$\sum_{i,j} f_d(a_i a_j) = \sum_k g_d(k) \cdot \left(\sum_{k \mid a_i} cnt[a_i]\right)^2 $$

    复杂度O(nlognF(d))O(n \log n \cdot F(d)),其中 F(d)F(d) 是与 dd 相关的因子

    方法二:DFS 序 + 数据结构

    将树转化为 DFS 序,那么每个子树对应一个区间:

    • 单点贡献:区间求和
    • 双点贡献:需要计算区间内所有点对的 fd(aiaj)f_d(a_i a_j) 之和

    使用莫队算法或分块处理。

    方法三:生成函数 + 卷积

    对于每个质因子 pp 考虑贡献,设 hp(k)h_p(k) 表示质因子 pp 的指数为 kk 时的贡献((1)k(-1)^k00)。

    总答案可以表示为各质因子贡献的卷积。

    数论细节

    fdf_d 的预处理

    预处理 11nn 的:

    • 质因数分解
    • 莫比乌斯函数 μ(i)\mu(i)
    • fd(i)f_d(i) 的值

    对于 fd(i)f_d(i),检查每个质因子的指数是否 d\le d,如果是则贡献 (1)k(-1)^{k},否则为 00

    贡献计算优化

    利用 aia_i 是排列的性质,每个值恰好出现一次。

    对于双点贡献:

    $$\sum_{i,j} f_d(a_i a_j) = \sum_{u,v} f_d(uv) \cdot [u \in S] \cdot [v \in S] $$

    其中 SS 是当前子树的权值集合。

    复杂度分析

    • 预处理O(nloglogn)O(n \log \log n) 筛法预处理数论函数
    • 树上启发式合并O(nlognτ(n))O(n \log n \cdot \tau(n)),其中 τ(n)\tau(n) 是因子个数
    • 空间复杂度O(n)O(n)

    n2×105n \le 2 \times 10^5 时,启发式合并是可行的。

    实现要点

    1. 数论预处理:线性筛预处理最小质因子、莫比乌斯函数
    2. fdf_d 计算:根据质因数分解计算每个数的 fdf_d
    3. 树上统计:维护当前子树的权值出现次数
    4. 贡献更新:添加/删除节点时更新单点和双点贡献

    总结

    本题的核心在于:

    1. 数论分析:理解 fdf_d 函数的积性性质和莫比乌斯表示
    2. 问题转化:将欢乐值计算转化为数论函数的求和
    3. 算法选择:使用树上启发式合并高效处理子树查询
    4. 优化技巧:利用数论性质和排列特性优化计算

    这是一个典型的数论与树算法结合的难题,需要深厚的数学功底和算法实现能力。

    • 1

    信息

    ID
    4410
    时间
    4000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者