#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-7;
const long long MOD = 1000000007LL;
const int INF = 0x3f3f3f3f;
const int _NAN = -0x3f3f3f3f;
const double EULC = 0.5772156649015328;
const int NIL = -1;
template <typename T>
void read(T &x) {
  x = 0;
  char ch = getchar();
  long long f = 1;
  while (!isdigit(ch)) {
    if (ch == '-') f *= -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - 48;
    ch = getchar();
  }
  x *= f;
}
const int maxn = 1e7 + 10;
bool isprime[maxn] = {1, 1};
int prime[maxn], kase;
vector<long long> ve;
long long ls[12] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};
int ans;
void primeMaker() {
  for (int i = 2; i < maxn; ++i) {
    if (!isprime[i]) prime[kase++] = i;
    for (int j = 0; j < kase && prime[j] * i < maxn; ++j) {
      isprime[i * prime[j]] = true;
      if (!(i % prime[j])) break;
    }
  }
}
int solve(long long &n) {
  long long t2 = n;
  int __max = -1;
  for (int i = 0; i < kase && prime[i] <= t2; ++i) {
    if (!(t2 % prime[i])) {
      int cnt = 0;
      while (!(t2 % prime[i])) {
        ++cnt;
        t2 /= prime[i];
      }
      if (__max != -1 && __max != cnt) ++ans;
      __max = max(__max, cnt);
      ve.push_back(prime[i]);
    }
  }
  if (ans) ans = 1;
  if (__max == -1) __max = 1;
  for (int i = 0; i < 10; ++i) {
    if (__max == ls[i]) break;
    if (__max > ls[i] && __max < ls[i + 1]) {
      __max = ls[i + 1];
      if (ans != 1) ++ans;
      break;
    }
  }
  n = 1;
  if (!ve.empty()) {
    for (auto num : ve) n *= num;
  }
  return __max;
}
int main(void) {
  primeMaker();
  long long n;
  while (~scanf("%lld", &n)) {
    ans = 0;
    if (!isprime[n]) {
      printf("%lld %d\n", n, 0);
      continue;
    }
    int res = solve(n);
    ans += log2l(res) + eps;
    printf("%lld %d\n", n, ans);
    ve.clear();
  }
  return 0;
}
