答案:10266837
public class Main {
static int n = 2022;
static int[] prev = new int[n];//前驱
static int[] dis = new int[n];//距离
static int INF = 0x3f3f3f3f;
public static void main(String[] args){
int[][] map = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
map[i][j]=INF;
}
}
for (int i = 1; i < n; i++) {
for (int j = i + 1; j < n && j <= i + 21; j++) {
if (j > 0) {
map[i][j] = map[j][i] = lcm(i,j);
}
}
}
dijkstra(1,prev,dis,map);
System.out.println(dis[2021]);
}
public static void dijkstra(int vs,int[] prev,int[] dis,int[][] map){
boolean[] vis = new boolean[map.length];
for(int i = 1;i<map.length;i++){
prev[i] = 0;
vis[i] = false;
dis[i] = map[vs][i];
}
vis[vs] = true;
dis[vs] = 0;
int k = 0;
for(int i = 2;i<map.length;i++){
int min = INF;
for(int j = 0;j<map.length;j++){
if(vis[j] == false && dis[j] < min){
min = dis[j];
k = j;
}
}
vis[k] = true;
for(int j = 0;j<map.length;j++){
int temp = (map[k][j] == INF ? INF :(min + map[k][j]));
if(vis[j] == false && temp < dis[j]){
prev[j] = k;
dis[j] = temp;
}
}
}
}
public static int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);
}
public static int lcm(int a, int b) {
int gc = gcd(a, b);
return a * b / gc;
}
}