// 4 的约数 是 1 2 和为 3 所以 3 -> 4 4 -> 3
// 7 的约数 是 1 和为 1 所以 1 -> 7 7 -> 1
// 2 的约数 是 1 和为 1 所以 1 -> 2 2 -> 1
// 3 的约数 是 1 和为 1 所以 1 -> 3 3 -> 1
// 5 的约数 是 1 和为 1 所以 1 -> 5 5 -> 1
// 6 的约数 是 1 2 3 和为 6 NaN
// 也就是说, 求邻接表向下走的最长路径
// 1. 暴力 - TLE
import java.util.*;
class Main{
static int N = 50010;
public static int dfs(int node, int father){
if(graph.get(node) == null) return 0;
int maxDepth = 0;
for(Integer j: graph.get(node)){
if(j == father) continue;
maxDepth = Math.max(maxDepth, 1 + dfs(j, node));
}
return maxDepth;
}
static Map<Integer, Set<Integer>> graph = new HashMap(N);
public static void add(int a, int b){
graph.putIfAbsent(a, new HashSet());
graph.get(a).add(b);
}
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 1; i <= n; i++){
int b = getDivideSum(i);
if(b >= i) continue; //如果一个数 x 的约数之和 y(不包括他本身)比他本身小
add(i, b); add(b, i);
}
int ans = 0;
for(int i = 1; i <= n; i++){
ans = Math.max(ans, dfs(i, -1));
}
System.out.println(ans);
}
public static int getDivideSum(int n){
int sum = 1;
for(int i = 2; i <= Math.sqrt(n); i++){
if(n % i == 0){
sum += i;
if( i * i != n ) sum += n / i;
}
}
return sum;
}
}
import java.util.*;
class Main{
static int N = 50010;
public static int dfs(int node, int father){
if(graph.get(node) == null) return 0;
int maxDepth = 0;
for(Integer j: graph.get(node)){
if(j == father) continue;
maxDepth = Math.max(maxDepth, 1 + dfs(j, node));
}
return maxDepth;
}
static Map<Integer, Set<Integer>> graph = new HashMap(N);
public static void add(int a, int b){
graph.putIfAbsent(a, new HashSet());
graph.get(a).add(b);
}
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 1; i <= n; i++){
int b = getDivideSum(i);
if(b >= i) continue;
add(i, b); add(b, i);
}
int ans = 0;
for(int i = 1; i <= n; i++){
ans = Math.max(ans, dfs(i, -1));
}
System.out.println(ans);
}
public static int getDivideSum(int n){
int sum = 1;
for(int i = 2; i <= Math.sqrt(n); i++){
if(n % i == 0){
sum += i;
if( i * i != n ) sum += n / i;
}
}
return sum;
}
}
感谢