3
static final double ONE_THIRD = 1.0d / 3.0d;5
public int minimumBoxes(int n) {6
int k = findLargestTetrahedralNotGreaterThan(n);7
int used = tetrahedral(k);8
int floor = triangular(k);9
int unused = (n - used);13
int r = findSmallestTriangularNotLessThan(unused);17
private final int findLargestTetrahedralNotGreaterThan(int te) {18
int a = (int) Math.ceil(Math.pow(product(6, te), ONE_THIRD));19
while (tetrahedral(a) > te) {25
private final int findSmallestTriangularNotLessThan(int t) {26
int a = -1 + (int) Math.floor(Math.sqrt(product(t, 2)));27
while (triangular(a) < t) {33
private final int tetrahedral(int a) {34
return (int) ratio(product(a, a + 1, a + 2), 6);37
private final int triangular(int a) {38
return (int) ratio(product(a, a + 1), 2);41
private final long product(long... vals) {43
for (long val : vals) {49
private final long ratio(long a, long b) {