/*
最短路径果断 bfs 这道题仅有2021个节点
因此只需要贪心一下计算出每个节点的最大值最后2021节点就是最优解
这道题最有意思的在于 求num节点和num+i的最小公倍数 其中i还不大于21
这里我们做一下推导
我们这里设 a = gcd(num,num+i) , b = num/a,c = (num+i)/a
这样我们就能得到
num = ab
num+i = ac
那么我们接下来来分析一下num+i这个最有趣的数字
num+i = ab + i = ac
i = a*(c-b)
显然i与num存在最大公约数
那么这里我们可以变换一下原式
a = gcd(num,i), b = num/a, c = i/a
num =ab
num+i = ab+ac = a(b+c)
lcm(num,num+i) = a(b+c)b = (num+i)*num/gcd(num,i)
num[i][j] = (i+j)i/gcd(i,j)
这里的话我们再做一下有趣的变换 i>1
a = gcd(numi,i) = i b = inum/a = num c = 1
numi = ab
inum+i = ab+ac
lcm(inum,inum+i) = a(b+c)b = i(num+1)num
num[ij][j] = ji*(i+1)
*/
#include<iostream>
#include<bitset>
using namespace std;
const int N = 10000;
long long route[2022];
long long node[int(3e4)][22];
long gcd(long i,long j){
return i%j?gcd(j,i%j):j;
}
int main()
{
prim = ~prim;//置1
prim[1] = true;
for(int i = 2;i*2<22;i++){//线性筛去素数
for(int j = 2;j*i<22;j++){
prim[j*i] = false;
}
}
for(int i = 2;i<=22;i++)
route[i] = i;
for(long i = 2;i<2021;i++){//到2021结束
for(long j = 1;j<22;j++){//每层bfs
// cout<<i<<" "<<i+j<<endl;
if(!node[i][j]) {//如果没计算过lcm先计算
int sub = gcd(i,j);
node[i][j] = (i+j)*i/gcd(i,j);
// cout<<sub<<" "<<node[i][j]<<endl<<endl;
}
if(i*j<2022&&j>1){
node[i*j][j] = j*i*(i+1);
}
if(i+j<2022){
// cout<<node[i][j]<<" "<<route[i]<<" "<<route[i+j]<<endl;
route[i+j] = route[i+j]&&route[i+j]<route[i]+node[i][j]?route[i+j]:route[i]+node[i][j];
if(!node[i][j]){
cout<<i<<j<<endl;
return 0;
}
// cout<<node[i][j]<<" "<<route[i]<<" "<<route[i+j]<<endl;
}
// cout<<endl;
}
//cout<<endl;
}
cout<<route[2021];
}