1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 50010; vector<int> G[N]; int d1[N], d2[N], ans, sum[N]; // d1[i]表示以i为出发点向下最长路径 // d2[i]表示以i为出发点向下第二长路径 void dfs(int x, int fa) { d1[x] = d2[x] = 1; for (int y : G[x]) if (y != fa) { dfs(y, x); if (d1[y] + 1 > d1[x]) d2[x] = d1[x], d1[x] = d1[y] + 1; else if (d1[y] + 1 > d2[x]) d2[x] = d1[y] + 1; } ans = max(ans, d1[x] + d2[x] - 1); } int main() { int n; scanf("%d", &n); memset(sum, 0, sizeof(sum)); for (int i = 2, j; i <= n; i++) { sum[i] = 1; for (j = 2; j * j < i; j++) if (i % j == 0) sum[i] += j + i / j; if (j * j == i) sum[i] += j; } for (int i = 1; i <= n; i++) if (sum[i] < i) G[sum[i]].push_back(i), G[i].push_back(sum[i]); memset(d1, 0, sizeof(d1)); memset(d2, 0, sizeof(d2)); ans = 0; dfs(1, -1); printf("%d\n", ans - 1); return 0; }
- 1
信息
- ID
- 1798
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 30
- 已通过
- 14
- 上传者