本题考查最短路、数论
用朴素版的dijkstra算法即可;
时间复杂度:O(n^2) 本题n = 2021
答案:10266837
import java.util.*;
public class Main {
static int N = 2030, M = N * 45;
static int h[] = new int[N], ne[] = new int[M], to[] = new int[M], w[] = new int[M], idx;
static boolean st[] = new boolean[N];
static int dist[] = new int[N];
static void add(int a, int b, int c) {
w[idx] = c; to[idx] = b; ne[idx] = h[a]; h[a] = idx ++ ;
}
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
static void dijkstra(int s) {
dist[s] = 0;
for(int i = 1; i <= 2021; i ++ ) {
int t = -1;
for(int j = 1; j <= 2021; j ++ )
if(!st[j] && (t == -1 || dist[j] < dist[t]))
t = j;
st[t] = true;
for(int j = h[t]; j != -1; j = ne[j]) {
int k = to[j];
dist[k] = Math.min(dist[k], dist[t] + w[j]);
}
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Arrays.fill(h, -1);
Arrays.fill(dist, 1 << 29);
for(int i = 1; i <= 2021; i ++ ) {
for(int j = i + 1; j <= 2021; j ++ ) {
if(j - i > 21) break;
int c = lcm(i, j);
add(i, j, c); add(j, i, c);
}
}
dijstra(1);
System.out.println(dist[2021]);
}
}