博客
关于我
DP/数论 - 树形DP - 数字转换
阅读量:369 次
发布时间:2019-03-04

本文共 1266 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要构建一个树结构,其中每个数 x 都与其约数之和 sum[x] 相连(前提是 sum[x] < x)。然后,我们需要找到这个树中最长路径的长度。

方法思路

  • 计算约数之和:对于每个数 x,计算其所有约数之和 sum[x]。我们可以使用高效的方法来计算这个值,例如反向遍历的方法。
  • 构建邻接表:根据 sum[x] < x 的条件,构建每个数 x 的邻接表。
  • 深度优先搜索 (DFS):从数 1 出发,进行一次 DFS,找到从 1 出发的最长路径。由于所有数都连接到 1 的连通块,这个路径很可能是整个图的最长路径。
  • 解决代码

    import sysfrom collections import dequedef main():    sys.setrecursionlimit(1 << 25)    n = int(sys.stdin.readline())    sum_num = [0] * (n + 1)    for i in range(1, n + 1):        for j in range(2, n // i + 1):            sum_num[i * j] += i    adj = [[] for _ in range(n + 1)]    for x in range(1, n + 1):        s = sum_num[x]        if s < x and s <= n:            adj[x].append(s)            adj[s].append(x)    visited = [False] * (n + 1)    max_path = 0    q = deque()    q.append((1, 0))    visited[1] = True    while q:        u, d = q.popleft()        if d > max_path:            max_path = d        for v in adj[u]:            if not visited[v]:                visited[v] = True                q.append((v, d + 1))    print(max_path)if __name__ == "__main__":    main()

    代码解释

  • 计算约数之和:使用双重循环遍历每个数 i 和其倍数 j,累加 i 到 sum_num[j] 中。
  • 构建邻接表:根据 sum_num[x] < x 的条件,构建每个数 x 的邻接表。
  • 广度优先搜索 (BFS):从数 1 开始,使用 BFS 遍历图,记录每个节点的访问状态,并计算最长路径的长度。
  • 这种方法高效地处理了约数之和的计算,并通过 BFS 确保找到最长路径。代码能够在较大的 n 值下高效运行,满足题目要求。

    转载地址:http://epor.baihongyu.com/

    你可能感兴趣的文章
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上打点并显示图标和文字
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    OpenLayers使用点要素作为标记
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers各组件默认的css样式
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    VM16+ubuntu20.04+win10如何固定虚拟机的ip (固定IP)
    查看>>
    OpenLayers学习一:地图加载(以类为接口)
    查看>>
    OpenLayers学习三:地图旋转及地图跳转到某一点的方式(以类为接口)
    查看>>
    OpenLayers学习二:点标记的添加删除和修改(以类为接口)
    查看>>
    Openlayers实战教程学习大纲及引导
    查看>>
    Openlayers实战:drawstart,drawend 绘制交互应用示例
    查看>>
    Openlayers实战:extent介绍及实际应用
    查看>>
    Openlayers实战:LayerGroup添加删除显示隐藏
    查看>>
    Openlayers实战:loadstart和loadend事件
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>