|
|
|
|
|
|
#include<stdio.h>
#include<math.h>
#define max 0x7fffffff
int mins[25],minv[25],ms,m,n;
![]()
void DFS(int cur_f,int last_r,int last_h,int leave_v,int sum_s)
![]() ![]() { int i,h,max_h,j,cur_v,cur_s;
if(sum_s+mins[cur_f]>=ms||leave_v<minv[cur_f])
return;
![]() if(cur_f==0) {
if(leave_v==0&&sum_s<ms)
ms=sum_s;
return;
}
![]() for(i=last_r-1;i>=cur_f;i--) {
h=(int)((leave_v-minv[cur_f-1])/(double)(i*i));
if(last_h-1<h)
max_h=last_h-1;
else max_h=h;
![]() for(j=max_h;j>=cur_f;j--) {
if(2*(leave_v-i*i*j)/i+sum_s+2*i*j>=ms) continue;
cur_s=2*i*j;
cur_v=i*i*j;
if(cur_f==m) cur_s+=i*i;
DFS(cur_f-1,i,j,leave_v-cur_v,sum_s+cur_s);
}
}
}
![]()
![]()
int main()
![]() ![]() { int i,beg;
mins[0]=0;
minv[0]=0;
![]() for(i=1;i<=20;i++) {
mins[i]=mins[i-1]+2*i*i;
minv[i]=minv[i-1]+i*i*i;
}
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
![]() { ms=max;
beg=(int)sqrt((double)n/m)+1;
DFS(m,beg,beg,n,0);
if(ms!=max) printf("%d\n",ms);
else printf("0\n");
}
return 0;
}
|
|