#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using bint = boost::multiprecision::cpp_int;
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
#define rep(i,n) for (int i = 0; i < (n); i++)
#define repSE(i,s,n) for (int i = (s); i < (n); i++)
#define ssort(v) sort(v.begin(), v.end())
#define gsort(v) sort(v.rbegin(), v.rend())
template<typename T> istream &operator>>(istream &is, vector<T> &vec){ for (auto &v : vec) is >> v; return is; }
template<typename T> ostream &operator<<(ostream &os, const vector<T> &vec){ os << "["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> ostream &operator<<(ostream &os, const deque<T> &vec){ os << "deq["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> ostream &operator<<(ostream &os, const set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const unordered_set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const unordered_multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T1, typename T2> ostream &operator<<(ostream &os, const pair<T1, T2> &pa){ os << "(" << pa.first << "," << pa.second << ")"; return os; }
template<typename TK, typename TV> ostream &operator<<(ostream &os, const map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename TK, typename TV> ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename T> bool chmax(T &m, const T q) { if (m < q) {m = q; return true;} else return false; }
template<typename T> bool chmin(T &m, const T q) { if (q < m) {m = q; return true;} else return false; }

vector<int> divisors(int n) {
    vector<int> divs;
    repSE(i, 1, int(sqrt(n))+1) {
        if (n % i == 0) {
            divs.push_back(i);
            if (i != n / i) {
                divs.push_back(n/i);
            }
        }
    }
    return divs;
}

int main()
{
    int X;
    cin >> X;
    vector<int> Xdiv = divisors(X);
    // cout << Xdiv << "\n";
    bool flag = false;
    for (auto d : Xdiv) {
        int X1 = X/d - d*d*d*d;
        if (X1%5 != 0) continue;
        int X2 = X1/5;
        //
        if (X2==0) {
            cout << 0 << " " << -d << endl;
            flag = true;
            break;
        }
        //
        if (X2 < 0) X2 = -X2;
        vector<int> X2div = divisors(X2);
        // cout << "d: " << d << ", X2: " << X2 << ", X2div: " << X2div << "\n";
        for (auto A : X2div) {
            if ((A*A*A*A*A  - (A-d)*(A-d)*(A-d)*(A-d)*(A-d)) == X) {
                cout << A << " " << A - d << "\n";
                flag = true;
                break;
            }
        }
        if (flag) break;
    }
    return 0;
}


Measured memory_bytes: 3608