#include <bits/stdc++.h>
using namespace std;
const int INF = (int)2e9;
const long long INFL = (long long)9e18;
const int MAXINT = ((~0) ^ (1 << 31));
const long long MAXLL = ((~0) ^ ((long long)1 << 63));
template <class T>
inline T pow2(T a) {
  return a * a;
}
template <class T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, true) : false;
}
template <class T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, true) : false;
}
long long find_last(long long n) {
  long long sq = pow(n, 1.0 / 3);
  sq = max(1ll, sq - 10);
  while (sq * sq * sq <= n) sq++;
  return sq - 1;
}
const int maxn = 1e5 + 100;
pair<long long, long long> sdp[maxn], sdpkhafan[maxn];
bool mdpkhafan[maxn];
pair<long long, long long> dp(long long n) {
  if (n == 0) return make_pair(0, 0);
  if (n == 1) return make_pair(1, 1);
  if (n == 2) return make_pair(2, 2);
  long long k = find_last(n);
  long long tof = find_last(n + 1);
  long long tofm1 = k;
  if (tof == tofm1 + 1 && mdpkhafan[tof]) return sdpkhafan[tof];
  if (tof == tofm1 + 1) mdpkhafan[tof] = true;
  k = k * k * k;
  pair<long long, long long> tmp = dp(k - 1), ret;
  long long blocks_f = n / k;
  long long blocks_c = (n + k - 1) / k;
  if (tmp.second > n % k)
    ret = make_pair(tmp.first + blocks_f - 1, tmp.second + k * (blocks_f - 1));
  else
    ret = make_pair(tmp.first + blocks_c - 1, tmp.second + k * blocks_f);
  tmp = dp(n % k);
  if (tmp.first + blocks_f >= ret.first)
    ret = make_pair(tmp.first + blocks_f, tmp.second + k * blocks_f);
  if (n % k == 0 && ret.first <= n / k) ret = make_pair(n / k, n);
  if (tof == tofm1 + 1) sdpkhafan[tof] = ret;
  return ret;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long n;
  cin >> n;
  pair<long long, long long> ans = dp(n);
  cout << ans.first << " " << ans.second << endl;
}
