1 条题解

  • 0
    @ 2025-10-29 20:55:32

    题目大意

    定义一种完美平衡树:

    权值为 11 的树是单节点树

    权值为 w2w \ge 2 的树有 kk 棵完全相同的子树 (2kw2 \le k \le w)

    每棵子树的权值为 w/k\lfloor w/k \rfloor

    给定 NN,求权值为 NN 的完美平衡树的数量。

    算法思路

    核心思想

    记忆化搜索 + 整除分块。

    f(n)f(n) 表示权值为 nn 的完美平衡树的数量。

    状态转移 对于 n2n \ge 2,枚举子树个数 kk,则每棵子树权值为 n/k\lfloor n/k \rfloor

    优化技巧

    1. 整除分块

    注意到 n/k\lfloor n/k \rfloor 的值在连续区间内相同,可以分段计算:

    对于 lkrl \le k \le r,如果 n/l=n/r\lfloor n/l \rfloor = \lfloor n/r \rfloor

    则这段的贡献为 f(n/l)×(rl+1)f(\lfloor n/l \rfloor) \times (r-l+1)

    1. 记忆化搜索

    小范围 (n105n \le 10^5) 用数组存储

    大范围用 map 存储

    基础情况:f(1)=1f(1) = 1

    算法流程

    读入 NN

    调用 get(N) 计算答案:

    如果 n=1n=1,返回 11

    如果已计算过,直接返回结果

    否则使用整除分块枚举所有可能的 n/k\lfloor n/k \rfloor

    累加贡献并存储结果

    输出答案

    复杂度分析

    时间复杂度:O(N3/4)O(N^{3/4})(整除分块 + 记忆化的复杂度)

    空间复杂度:O(N1/2)O(N^{1/2})(存储状态数)

    总结

    本题是数论与动态规划的结合:

    递归定义:利用树的递归定义设计状态转移

    整除分块:关键优化,将 O(N)O(N) 枚举降为 O(N)O(\sqrt{N})

    记忆化搜索:避免重复计算,处理 N109N \le 10^9 的大数据

    这种"整除分块 + 记忆化"的技巧可以推广到其他涉及 n/k\lfloor n/k \rfloor 求和的计数问题,体现了数论优化在组合计数中的重要作用。

    • 1

    信息

    ID
    4682
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者