反正是填空题,floyd跑得慢也没问题,关键是好写
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int gcd(int a, int b) {
if (a == 0)
return b;
else
return gcd(b % a, a);
}
const int N = 2050;
int map[N][N];
int main() {
memset(map, 0x3f, sizeof map);
for (int i = 1; i <= 2021; i++)
map[i][i] = 0;
cout<<3<<endl;
for (int i = 1; i < 2021; i++) {
for (int j = i + 1; j <= 2021; j++) {
if (j - i <= 21) {
int g = gcd(i, j);
g = i * j / g;
map[i][j] = g;
map[j][i] = g;
} else
break;
}
}
for (int k = 1; k <= 2021; k++) {
for (int i = 1; i <= 2021; i++) {
for (int j = 1; j <= 2021; j++) {
if (i == j)
continue;
if (map[i][j] > map[i][k] + map[k][j]) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
cout << map[1][2021] << endl;
//10266837
}