#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
using std::unordered_map;
using std::vector;
bool is_prime(long long n) {
  long long divisors = 0;
  for (long long i = 2; i < sqrt(n); ++i) {
    if (n % i == 0) {
      ++divisors;
    }
  }
  return divisors == 0 ? true : false;
}
int main() {
  std::ios::sync_with_stdio(false);
  long long n;
  cin >> n;
  long long square_root = sqrt(n) + 1;
  long long max = 1;
  long long counter = 1;
  long long curr_divisor = 2;
  long long min_number = 0;
  vector<long long> divisors;
  while (n > 1 && curr_divisor <= n) {
    if (n % curr_divisor == 0 && is_prime(curr_divisor)) {
      counter = n % curr_divisor;
      if (min_number == 0) {
        min_number = curr_divisor;
      } else {
        min_number *= curr_divisor;
      }
      while (n % curr_divisor == 0) {
        n = n / curr_divisor;
        counter++;
      }
      divisors.push_back(counter);
      if (counter > max) {
        max = counter;
      }
    }
    ++curr_divisor;
  }
  if (divisors.size() == 0) {
    divisors.push_back(1);
    min_number = n;
  }
  bool multiply = false;
  bool all_one = true;
  for (int i = 0; i < divisors.size(); ++i) {
    if (divisors[i] != 1) {
      all_one = false;
      break;
    }
  }
  for (int i = 0; i < divisors.size(); ++i) {
    if (!(divisors[i] != 0 && (divisors[i] & (divisors[i] - 1)) == 0) ||
        (divisors[i] == 1 && divisors.size() > 1 && !all_one) ||
        divisors[i] != max) {
      multiply = true;
    }
  }
  if (all_one) {
    multiply = false;
  }
  int sqrt_operations = ceil(log2(max));
  if (multiply) {
    cout << min_number << " " << sqrt_operations + 1 << endl;
  } else {
    cout << min_number << " " << sqrt_operations << endl;
  }
}
