#sXDPybttg050203. 1577:【例 3】数字转换

1577:【例 3】数字转换

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

如果一个数 xx 的约数和 yy(不包括 xx 本身)比 xx 本身小,那么 xx 可以变成 yyyy 也可以变成 xx。例如 44 可以变为 3311 可以变为 77

限定所有数字变换在不超过 nn 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数。


输入格式

输入一个正整数 nn


输出格式

输出不断进行数字变换且不出现重复数字的最多变换步数。


样例

样例输入

7

样例输出

3

样例解释

n=7n=7,在 171 \dots 7 中,满足“约数和(不包括本身)比本身小”的数对有:

  • 4 的约数和(不包括本身)为 1+2=31+2=3,3<4,所以 4 ↔ 3
  • 6 的约数和为 1+2+3=61+2+3=6,6=6,不满足“小于”,所以无变换
  • 其他检查:
    1 的约数和(不包括本身)为 0,0<1,所以 1 ↔ 0,但 0 不在范围内,所以 1 不能变为其他数?实际上 1 的约数和为 0,但 0 不在正整数范围内,所以 1 不能变为别的数,但别的数可以变为 1(如果约数和是 1)。
    3 的约数和为 1,1<3,所以 3 ↔ 1
    7 的约数和为 1,1<7,所以 7 ↔ 1

因此关系图(无向边):

  • 4 ↔ 3
  • 3 ↔ 1
  • 7 ↔ 1

形成图:1--3--4 和 1--7。

要求找最长不重复数字的路径(即图中的最长链)。

最长链是 4 → 3 → 1 → 7,长度为 3(步数 = 边数 = 链长 - 1,所以输出 3)。


数据范围

对于 100%100\% 的数据,1n500001 \le n \le 50000


时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
本题可以转化为 树的最长链(直径) 问题。

对于每个 xx,如果 y=sum_divisors(x)<xy = \text{sum\_divisors}(x) < xy1y \ge 1,则在 xxyy 之间连一条无向边。
注意 yy 可能大于 nn 吗?不会,因为 y<xny < x \le n,所以 yn1y \le n-1

这样构造的图是一个森林(可能有多个连通块),因为每个 xx 最多只有一个 yy 满足 y<xy < xyyxx 的约数和,所以每个节点最多只有一个“父节点”(即 yy),整个图是无向无环图(多棵树)。

问题转化为:在森林中找最长路径(直径)。

方法:对每个连通块(树),用两次 DFS 或 BFS 求树的直径(最长链)。

  • 第一次从任意节点出发,找到最远点 uu
  • 第二次从 uu 出发,找到最远点 vvuuvv 的距离就是该树的直径。

取所有连通块的直径的最大值作为答案。

复杂度:O(n)O(n)

注意:要预处理 1n1 \dots n 每个数的约数和,可以用类似筛法 O(nlogn)O(n \log n) 完成。