#include<iostream>
#include<cmath>
using namespace std;
const int N=25,INF=0x3f3f3f3f;
int n,m,minv[N],mins[N],r[N],h[N];
int ans=INF;
void dfs(int u,int v,int s)//当前处理的层数,当前总体积,总面积
{
if(s+mins[u]>=ans)//剩余层以最小的面积分配,加和面积大于等于当前最优解
return;
if(v+minv[u]>n)//剩余层以最小的体积分配,加和体积大于总体积n
return;
if(s+2*(n-v)/r[u+1]>=ans)//剩余层都以最大的半径分配(可推半径最大则侧面积最小),即半径为上一层的半径,即剩余层视为
return;//半径为r[u+1],可得高为(n-v)/r[u+1]/r[u+1]的圆柱,此时总侧面积为s+2*(n-v)/r[u+1],若其大于当前最优解,应该被剪掉
if(!u)//已经处理完所有层
{
if(v==n)
ans=s;
return;
}
for(int i=min((int)sqrt(n-v),r[u+1]-1);i>=u;i--)
for(int j=min((n-v)/i/i,h[u+1]-1);j>=u;j--)
{
int t=0;
if(u==m)//第m层即最底层,应该加上底面积
t=i*i;
r[u]=i,h[u]=j;
dfs(u-1,v+i*i*j,s+t+2*i*j);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
minv[i]=minv[i-1]+i*i*i;//预处理前i层最小的体积
mins[i]=mins[i-1]+2*i*i;//预处理前i层最小的面积
}
r[m+1]=INF,h[m+1]=INF;//边界,求第m层的最大半径和最大高使用
dfs(m,0,0);
if(ans==INF)
ans=0;
cout<<ans;
return 0;
}