import std.stdio;
import std.ascii;
import std.range;
import std.array;
import std.functional;
import std.algorithm;
import std.conv;
import std.container;
import std.math;
import std.numeric;
import std.string;
import std.c.string;
import std.random;
import std.regex;
import std.typecons;

int[] T, O;

int calc(int x) {
    return x * (x + 1) * (x + 2) / 6;
}

void prepare() {
    for (int i = 1; ; i++) {
        int x = calc(i);
        if (x > 1000000) break;
        T ~= x;
        if (x % 2 == 1) O ~= x;
    }
    O.sort!"a > b";
    T.sort!"a > b";
}

void main() {
    prepare;
    int N;
    bool input() {
        scanf("%d\n", &N);
        if (N == 0) return false;
        return true;
    }
    void solve() {

        int dfs(int[] T, int index, int X) {
            int ret = int.max / 2;
            if (X == 0) return 0;
            if (index == T.length) return int.max / 2;
            for (int i = X / T[index]; i >= 0; i--) {
                ret = min(ret, dfs(T, index + 1, X - i * T[index]) + i);
            }
            return ret;
        }

        writeln(dfs(T, 0, N), " ", dfs(O, 0, N));

    }
    while (input) solve;
}