#include <bits/stdc++.h>
using namespace std;
void scan() {}
template <typename T, typename... Args>
void scan(T &a, Args &...args) {
  scanf("%lld", &a);
  scan(args...);
}
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  err(++it, args...);
}
long long mul_mod(long long a, long long b, long long m) {
  long double x;
  long long c;
  long long r;
  if (a >= m) a %= m;
  if (b >= m) b %= m;
  x = a;
  c = x * b / m;
  r = (long long)(a * b - c * m) % (long long)m;
  return r < 0 ? r + m : r;
}
long long mod(long long n, long long m = 1000000007) {
  n %= m;
  while (n < 0) {
    n += m;
  }
  return n;
}
long long power(long long x, unsigned long long y, long long z = 1000000007) {
  long long res = 1;
  x = mod(x, z);
  while (y > 0) {
    if (y & 1) res = mod(res * x, z);
    y = y >> 1;
    x = mod(x * x, z);
  }
  return res;
}
void solve() {
  ;
  long long n;
  ;
  { scan(n); };
  ;
  long long n2 = n, c = 0, maxi = 0, ans = 1;
  vector<long long> vec;
  for (long long i = 2; i * i <= n; i++) {
    if (n2 % i == 0) {
      long long c = 0;
      while (n2 % i == 0) n2 /= i, c++;
      vec.push_back(c);
      long long flag = ((c & (c - 1)) != 0), cnt = 0;
      while (c != 1) {
        c /= 2;
        cnt++;
      }
      ans *= i;
      maxi = max(maxi, cnt + flag);
    }
  }
  if (n2 > 1) {
    vec.push_back(1), ans *= n2, maxi = max(maxi, 0ll);
  }
  long long flag = 0;
  for (auto x : vec) {
    if (x != power(2, maxi)) {
      flag = 1;
    }
  }
  printf("%lld %lld\n", ans, maxi + flag);
  ;
}
int main() {
  solve();
  return 0;
}
