main.cc 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = 10000;
  7. const int M = 20;
  8. const int INF = 1 << 30;
  9. int n, m, min_area = INF;
  10. int min_v[M + 1]; // Min v required for i layers cake
  11. int min_a[M + 1]; // Min side area required
  12. int maxv_for_lrh(int l, int r, int h) { // Max v for given l, r and h
  13. int v = 0;
  14. for (int i = 0; i < l; i++) v += (r - i) * (r - i) * (h - i);
  15. return v;
  16. }
  17. void dfs(int l, int v, int area, int r, int h) {
  18. if (l == 0) {
  19. if (v) return;
  20. min_area = min(min_area, area);
  21. return;
  22. }
  23. if (v <= 0) return;
  24. if (v < min_v[l]) return;
  25. if (min_area <= area + min_a[l]) return;
  26. if (r < l || h < l) return;
  27. if (maxv_for_lrh(l, r, h) < v) return;
  28. for (int nr = r; l <= nr; nr--) {
  29. if (l == m) area = nr * nr; // The area of bottom
  30. for (int nh = h; l <= nh; nh--)
  31. dfs(l - 1, v - nr * nr * nh, area + 2 * nr * nh, nr - 1, nh - 1);
  32. }
  33. }
  34. int main() {
  35. scanf("%d %d", &n, &m);
  36. min_v[0] = 0;
  37. min_a[0] = 0;
  38. for (int i = 1; i <= m; i++) {
  39. min_v[i] = min_v[i - 1] + i * i * i;
  40. min_a[i] = min_a[i - 1] + 2 * i * i;
  41. }
  42. if (min_v[m] <= n) { // Max h and r for bottom layer
  43. int max_h = (n - min_v[m - 1]) / (m * m) + 1;
  44. int max_r = sqrt(double(n - min_v[m - 1]) / m) + 1;
  45. dfs(m, n, 0, max_r, max_h);
  46. }
  47. if (min_area == INF)
  48. printf("0\n");
  49. else
  50. printf("%d\n", min_area);
  51. return 0;
  52. }