#include<bits/stdc++.h>
using namespace std;
struct EDGE
{
long long l,t,next;
}edge[100003];
struct node
{
long long l,t;
bool operator<(const node &a)const
{
return l>a.l; //注意这里的运算符重载
}
};
long long head[100003];
long long vis[2023];
long long dis[2023];
long long pos=0;
void add(long long x,long long y,long long z)
{
edge[++pos].l=z;
edge[pos].t=y;
edge[pos].next=head[x];
head[x]=pos;
}
long long gcd(long long a,long long b)
{
return a%b==0?b:gcd(b,a%b);
}
long long dij(long long s,long long t)
{
priority_queue<node>q;
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
node u;
u.l=0;
u.t=s;
q.push(u);
dis[s]=0;
while(!q.empty())
{
node v=q.top();
q.pop();
if(vis[v.t]==1)continue;
vis[v.t]=1;
for(long long i=head[v.t];i!=-1;i=edge[i].next)
{
long long y=edge[i].t;
long long len=edge[i].l;
if(dis[y]>dis[v.t]+len)
{
dis[y]=dis[v.t]+len;
node t1;
t1.l=dis[y];
t1.t=y;
q.push(t1);
}
}
}
return dis[t];
}
int main()
{
memset(head,-1,sizeof(head)); //这里不初始化会炸
memset(edge,-1,sizeof(edge));
for(long long i=1;i<=2021;i++)
for(long long j=i+1;j<=2021;j++)
{
if(i!=j&&abs(i-j)<=21)
{
long long len=gcd(i,j);
len=i*j/len; //lcm(i,j)*gcd(i,j)==i*j
add(i,j,len);
}
}
cout <<dij(1,2021)<<endl;
return 0;
}