#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "[";
  for (int i = 0; i < v.size(); ++i) {
    os << v[i];
    if (i != v.size() - 1) os << ", ";
  }
  os << "]\n";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
  os << "[";
  for (auto it : v) {
    os << it;
    if (it != *v.rbegin()) os << ", ";
  }
  os << "]\n";
  return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const map<T, S>& v) {
  for (auto it : v) os << it.first << " : " << it.second << "\n";
  return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
  os << "(";
  os << v.first << ", " << v.second << ")";
  return os;
}
void go() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
}
int32_t main() {
  go();
  long long n;
  cin >> n;
  if (n == 1) {
    cout << 1 << ' ' << 0;
    return 0;
  }
  map<long long, long long> m;
  long long x = n;
  while (x % 2 == 0) {
    m[2]++;
    x /= 2;
  }
  for (long long i = 3; i * i <= x; i += 2) {
    while (x % i == 0) {
      m[i]++;
      x /= i;
    }
  }
  if (x > 1) {
    m[x]++;
  }
  set<long long> s;
  long long ans = 1, ops = 0, k = 0;
  for (auto x : m) {
    ans *= x.first;
    long long y = x.second;
    s.insert(y);
    k = max(k, x.second);
  }
  if (k == 1) {
    cout << ans << ' ' << ops;
    return 0;
  }
  if (s.size() == 1) {
    long long p = *s.begin();
    if ((p & (p - 1)) != 0) {
      ops++;
    }
  } else {
    ops++;
  }
  if ((k & (k - 1)) == 0) {
    while (k > 1) {
      k >>= 1;
      ops++;
    }
  } else {
    long long num = 0, tt = 0;
    while (num < k) {
      num = (1 << tt);
      tt++;
    }
    ops--;
    ops += tt;
  }
  cout << ans << ' ' << ops << '\n';
  return 0;
}
