7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为N*pi的M层生日蛋糕,每层都是一个圆柱体。 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。 令Q = S*pi 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。(除Q外,以上所有数据皆为正整数) 

//sprayoflearn
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstring>
int ans=999999;
int n,m,temp;
int min[50];
inline int max(int r,int h,int k)
{
	int i,p=0;
	for (i=1;i<=k;i++) p+=(r-i)*(r-i)*(h-i);
	return p;
}

void dfs(int v,int k,int r,int h,int s)
{
	int ss=s,sss=s,vv=v;
	for (int i=r-1;i>0;i--)
	{
		if (k==1) ss=s+i*i;
		for (int j=1;j<h && i*i*j<=v;j++)
		{
			sss=ss+2*i*j;
			vv=v-i*i*j;
			if (vv<min[m-k]) break;
			if (vv>max(i,j,m-k)) continue;
			double tmp;
			tmp=3*pow((double)vv,2.0/3.0)-(i-1)*(i-1);
			if (tmp+sss>ans) continue;
			if (k<m) dfs(vv,k+1,i,j,sss);
				else if (sss<ans) ans=sss;
		}
	}
}

int main()
{
	//freopen("cake.in","r",stdin);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++) min[i]=min[i-1]+i*i*i;
	temp=sqrt((double)n)-m*(m-1)/2+1;
	dfs(n,1,temp,temp,0);
	printf("%d\n",ans);
	return 0;
}