1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 #define CLR(a,b) memset((a),(b),sizeof(a))
7 using namespace std;
8
9 const int inf = 0x3f3f3f3f;
10 int ans; //最优表面积
11 int area; //正在搭建中的蛋糕的表面积
12 int N, M;//体积N,层数M
13 int minv[21]; //第i层蛋糕最少的体积
14 int mins[21]; //第i层蛋糕的最少侧表面积
15
16 int maxV(int n, int r, int h){
17 //在n层蛋糕,底层最大半径r,最高高度h的情况下,能凑出来的最大体积
18 int v = 0;
19 for(int i = 0; i < n; ++i)
20 v += (r - i) * (r - i) * (h - i);
21 return v;
22 }
23 void dfs(int v, int n, int r, int h){
24 //用n层去凑体积v,最底层半径最大为r, 高度最大为 h
25 //求出最小表面积放入ans
26 if(n == 0){
27 if(v == 0 && area < ans){
28 ans = area;
29 return;
30 }
31 }
32 if(v <= 0) return;
33
34 if((2*v*1./r+area)>=ans) return;
35 if(area + mins[n] >= ans ) return;
36 if(h < n || r < n) return;
37 if(v < minv[n]) return;
38 if(maxV(n, r, h) < v) return;
39 for(int rr = r ; rr >= n; --rr){//从大到小搜索!
40 if(n == M) //底面积(总的上表面积)
41 area = rr * rr;
42 for(int hh = n; hh <= h; ++hh){
43 area += 2 * rr * hh;
44 dfs(v - rr*rr*hh, n-1, rr-1, hh-1);
45 area -= 2 * rr * hh;
46 }
47 }
48 }
49 int main(){
50 int i, j;
51 int maxh;//底层最大高度
52 int maxr;//底层最大半径
53 scanf("%d %d", &N, &M);
54
55 CLR(minv, 0); CLR(mins, 0);
56
57 for(i = 1; i <= M; ++i){
58 //第i层半径至少为i,,高度至少为i
59 minv[i] = minv[i - 1] + i * i * i;
60 mins[i] = mins[i - 1] + 2 * i * i;
61 }
62 if(minv[M] > N){
63 printf("0
"); return 0;
64 }
65 area = 0;
66 ans = inf;
67 //底层体积不超过(n - minv[m - 1])
68 maxh = (N - minv[M - 1]) / (M * M) + 1; //底层半径至少为 m
69 maxr = sqrt(1.*(N - minv[M-1]) / M) + 1;//底层高度至少为 m
70
71 dfs(N, M, maxr, maxh);
72
73 if(ans == inf) printf("0
");
74 else printf("%d
", ans);
75 return 0;
76 }