#include <bits/stdc++.h>
using namespace std;
int Int() {
  int x;
  scanf("%d", &x);
  return x;
}
long long Long() {
  long long x;
  scanf("%lld", &x);
  return x;
}
void err(istream_iterator<string> it) { cout << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << ' ';
  err(++it, args...);
}
const int N = (int)1e6 + 5;
const int maxN = (int)1e6 + 6;
const long long Mod = (long long)1e9 + 7;
bool is_composite[N];
std::vector<int> pm;
void linear_sieve() {
  for (int i = 2; i < N; i++) {
    if (!is_composite[i]) pm.push_back(i);
    for (int j = 0; j < (int)pm.size() and i * pm[j] < N; j++) {
      is_composite[i * pm[j]] = 1;
      if (i % pm[j] == 0) break;
    }
  }
}
int main() {
  int test = 1, tc = 0;
  while (test--) {
    int n = Int();
    if (n == 1) return puts("1 0"), 0;
    linear_sieve();
    set<int> st;
    long long num = 1LL;
    for (int i = 0; i < (int)pm.size() and pm[i] * pm[i] <= n; ++i) {
      int cnt = 0;
      while (n % pm[i] == 0) {
        n /= pm[i];
        ++cnt;
      }
      if (cnt) st.insert(cnt), num *= 1LL * pm[i];
    }
    if (n > 1) st.insert(1), num *= 1LL * n;
    int res = 1;
    if ((int)st.size() == 1) res = 0;
    int mx = *st.rbegin();
    if (!(mx & (mx - 1))) {
      int b = __builtin_ctz(mx);
      return printf("%lld %d\n", num, res + b), 0;
    }
    if ((int)st.size() == 1) res++;
    if (mx & 1) mx++;
    if (!(mx & (mx - 1))) {
      res += __builtin_ctz(mx);
      return printf("%lld %d\n", num, res), 0;
    }
    while (mx & (mx - 1)) mx += (mx & -mx);
    res += __builtin_ctz(mx);
    printf("%lld %d\n", num, res);
  }
  return 0;
}
