import java.util.*;
public class Main {
public static void main(String[] args) {
int[][] e = new int[2022][2022];
int[] dist = new int[2022];
boolean[] visit = new boolean[2022];
Arrays.fill(dist, Integer.MAX_VALUE);
for(int i = 1; i <= 2021; i++){ // 构建邻接矩阵
for(int j = 1; j <= 2021; j++){
if(i == j){
e[i][j] = 0;
}else{
if(Math.abs(i - j) <= 21){
e[i][j] = i * j / gcd(i, j);
}
else{
e[i][j] = Integer.MAX_VALUE;
}
}
}
}
// 从 顶点 1 到达其他顶点的最短路劲!
dist[1] = 0;
// 遍历所有顶点!
for(int i = 1; i <= 2021; i++){// 更新从顶点 1 能够到达的所有顶点的最短路径!
int u = 0, min = Integer.MAX_VALUE;
for(int j = 1; j <= 2021; j++){// 从未遍历的顶点中找到最近的顶点以及路劲长度!
if(!visit[j] && dist[j] < min){
min = dist[j];
u = j;
}
}
visit[u] = true; // 做标记!
for(int j = 1; j <= 2021; j++){ // 找最近顶点能直接到达的其他顶点的最短路劲!
if(e[u][j] != Integer.MAX_VALUE && dist[u] + e[u][j] < dist[j]){
dist[j] = dist[u] + e[u][j];
}
}
}
System.out.println(dist[2021]);
}
static int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
}
10-06
333
10-08
1417
10-08
733