#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read(T& x) {
  x = 0;
  int f = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x = f ? -x : x;
}
const int N = 1e6 + 10;
long long n;
int primes[N];
vector<int> vec;
void init() {
  for (int i = 2; i <= 1e6; ++i) {
    if (!primes[i]) primes[++primes[0]] = i;
    for (int j = 1; j <= primes[0] && i * primes[j] <= 1e6; ++j) {
      primes[i * primes[j]] = 1;
      if (i % primes[j] == 0) break;
    }
  }
}
int main() {
  init();
  read(n);
  if (n == 1) return puts("1 0"), 0;
  long long ans = 1;
  int mx = 0;
  for (int i = 1; i <= primes[0]; ++i) {
    if (n % primes[i] == 0) {
      int cnt = 0;
      while (n % primes[i] == 0) {
        cnt++;
        n /= primes[i];
      }
      ans = 1LL * ans * primes[i];
      vec.emplace_back(cnt);
      mx = max(mx, cnt);
    }
  }
  ans = 1LL * ans * n;
  int L = 1, c = 0;
  for (; L < mx; L <<= 1) c++;
  if (L > mx) L >>= 1;
  bool flag = 0;
  for (int i = 0; i < (int)vec.size(); ++i) {
    flag |= vec[i] != L;
  }
  printf("%lld %d\n", ans, c + flag);
  return 0;
}
