#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, 1, 0, 0, 0, 0, 0, 0};
int dy[] = {0, 0, 1, -1, 0, 0, 0, 0};
const int inf = 1000000000;
const int seivesize = 1000005;
const double eps = 0.000000009;
int* seive;
vector<int> primes;
long long gcd(long long a, long long b) { return (b == 0) ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }
void fill() {
  seive = new int[seivesize];
  primes.clear();
  for (int i = 0; i < seivesize; i++) {
    seive[i] = 1;
  }
  seive[0] = seive[1] = 0;
  for (int i = 2; i < seivesize; i++) {
    if (seive[i] == 1) {
      primes.push_back(i);
      for (int j = i + i; j < seivesize; j = j + i) {
        seive[j] = 0;
      }
    }
  }
}
map<int, int> sol;
void pri(long long n) {
  long long ind = 0;
  long long pf = primes[ind];
  while (pf * pf <= n) {
    while (n % pf == 0) {
      sol[pf]++;
      n /= pf;
    }
    pf = primes[++ind];
  }
  if (n > 1) sol[n]++;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long n;
  cin >> n;
  if (n == 1) {
    cout << 1 << " " << 0 << endl;
    return 0;
  }
  fill();
  pri(n);
  map<int, int>::iterator it = sol.begin();
  int maxpow = 0;
  long long ans = 1;
  for (it; it != sol.end(); it++) {
    maxpow = max(maxpow, (*it).second);
    ans *= (*it).first;
  }
  it = sol.begin();
  int f = 0;
  for (it; it != sol.end(); it++) {
    if ((*it).second != maxpow) {
      f = 1;
      break;
    }
  }
  if (log2(maxpow) - floor(log2(maxpow)) > eps) {
    f = 1;
  }
  cout << ans << " " << ceil(log2(maxpow)) + f << endl;
  return 0;
}
