1000000000000000
 994
 200385
 3842529393411
 8
 409477218238717
 2
 419477218238718
 909383000
 7
 999088000000000
 265
 415000000238718
 780869426483087
 9
 850085504652042
 567000123
 980123123123123
 409477218238719
 385925923480002
 999998169714888
 936302451686999
 114
 999999993700000
 108000000057
 409477218238716
 112
 1
 409477218238718
 999971000299999
 409477318238718
 735412349812385
 113
 999999999999999
 123830583943
 899990298504716
 936302451687000
 995
 990000000000000
 936302451687001
 999986542686123
 850085504652041

18 999999993541753
 12 941
 14 200355
 17 3842529383076
 7 7
 17 409477218238717
 2 2
 18 419466459294818
 16 909381874
 7 7
 18 999087986204952
 11 212
 18 414993991790735
 18 780869407920631
 7 7
 18 850085504652042
 16 566998782
 18 980123123116482
 18 409477218238718
 17 385925923479720
 18 999998150030846
 18 936302448662019
 11 114
 18 999999993541753
 17 107986074062
 17 409477218238710
 10 106
 1 1
 18 409477218238718
 18 999969994441746
 18 409477218238718
 18 735409591249436
 10 113
 18 999999993541753
 17 123830561521
 18 899973747835553
 18 936302448662019
 12 995
 18 989983621692990
 18 936302448662019
 18 999969994441746
 18 850085504650655

import java.util.*;

import java.io.*;
import java.text.*;

public class D680 {
	public static long pow3(long x) {
		return x * x * x;
	}

	static TreeSet<Long> ts;
	static HashMap<Long, Pair> memo = new HashMap<Long, Pair>();

	public static Pair solve(long m) {

		if (m < 8) {
			return new Pair(m, m);
		}
		if (memo.containsKey(m)) {
			Pair p = memo.get(m);
			Pair n = new Pair(p.x, p.y);
			return n;
		}
		long g = ts.floor(m);

		int mult = 0;
		Pair ans = null;
		while (m - g * mult >= 0) {
			Pair cand = solve(Math.min(m - g * mult, g - 1));
			cand.x += mult;
			cand.y += g * mult;
			if (ans == null)
				ans = cand;
			else {
				if (cand.x > ans.x) {
					ans = cand;
				} else if (cand.x == ans.x) {
					if (cand.y > ans.y)
						ans = cand;
				}
			}
			mult++;
		}
		memo.put(m, ans);
		return new Pair(ans.x, ans.y);

	}

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		long m = sc.nextLong();
		ts = new TreeSet<Long>();
		for (int i = 1; i <= (int) 1e5; i++) {
			ts.add(pow3(i));
		}
		Pair ans = solve(m);
		pw.println(ans.x + " " + ans.y);
		pw.close();
	}

	static class Pair {
		long x, y;

		public Pair(long a, long b) {
			x = a;
			y = b;
		}
	}

	static class Scanner {
		StringTokenizer st;
		BufferedReader br;

		public Scanner(InputStream s) {
			br = new BufferedReader(new InputStreamReader(s));
		}

		public Scanner(FileReader r) {
			br = new BufferedReader(r);
		}

		public String next() throws IOException {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public String nextLine() throws IOException {
			return br.readLine();
		}

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

		public boolean ready() throws IOException {
			return br.ready();
		}

	}
}
