AcWing 1075. 数字转换
原题链接
中等
作者:
JiaoZiLang
,
2020-06-25 15:48:49
,
所有人可见
,
阅读 605
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 50010;
int e[N], ne[N], h[N], idx, w[N];
int sum[N];
bool st[N];
int ans, n;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u) {
st[u] = true;
int dist = 0;
int d1 = 0, d2 = 0;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (!st[j]) {
int d = dfs(j);
dist = max(dist, d);
if(d >= d1) {
d2 = d1, d1 = d;
} else if (d > d2){
d2 = d;
}
}
}
ans = max(ans, d1 + d2);
return dist + 1;
}
int main() {
cin >> n;
memset(h, -1, sizeof h);
for (int i = 1; i <= n; i++) {
for (int j = 2; j <= n/i; j++) {
sum[i*j] += i;
}
}
for (int i = 2; i <= n; i++) {
if (sum[i] < i) {
add(sum[i], i);
}
}
for (int i = 1; i <= n; i++) {
if (!st[i])
dfs(i);
}
cout << ans << endl;
return 0;
}