#include <algorithm>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <string>
#include <vector>

// Acknowledgement: Special thanks to kyomukyomupurin, who developed this
// template.
template <class T, class U>
std::ostream& operator<<(std::ostream& os, const std::pair<T, U>& p) {
  return os << '(' << p.first << ", " << p.second << ')';
}

template <class T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
  int n = 0;
  for (auto e : vec) os << (n++ ? ", " : "{") << e;
  return os << (n ? "}" : "{}");
}

template <class T>
std::ostream& operator<<(std::ostream& os, const std::set<T>& st) {
  int n = 0;
  for (auto e : st) os << (n++ ? ", " : "{") << e;
  return os << (n ? "}" : "{}");
}

template <class T, class U>
std::ostream& operator<<(std::ostream& os, const std::map<T, U>& mp) {
  int n = 0;
  for (auto e : mp) os << (n++ ? ", " : "{") << e;
  return os << (n ? "}" : "{}");
}

template <class T>
std::istream& operator>>(std::istream& is, std::vector<T>& vec) {
  for (T& e : vec) is >> e;
  return is;
}

#ifdef LOCAL
#define debug(...) \
  std::cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__)
#else
#define debug(...)
#endif

void debug_out() { std::cerr << '\n'; }

template <class Head, class... Tail>
void debug_out(Head&& head, Tail&&... tail) {
  std::cerr << head;
  if (sizeof...(Tail) != 0) std::cerr << ", ";
  debug_out(std::forward<Tail>(tail)...);
}
using namespace std;
using int64 = long long;

// map<int64, int64> decomposition(int64 N) {
//   map<int64, int64> result;
//   int64 tmp = N;
//   int64 amari;
//   for (int64 i = 2; i * i <= N; i++) {
//     if (tmp == 1) {
//       break;
//     }
//     amari = tmp % i;
//     if (amari == 0) {
//       result[i] = 0;
//       while (amari == 0) {
//         tmp /= i;
//         result[i]++;
//         amari = tmp % i;
//       }
//     }
//   }
//   return result;
// }

template <class _Tp>
std::map<_Tp, int> prime_fact(_Tp n) {
  std::map<_Tp, int> result;
  for (_Tp i = 2; i * i <= n; ++i) {
    if (n % i != 0) continue;
    int cnt = 0;
    while (n % i == 0) {
      n /= i;
      ++cnt;
    }
    result[i] = cnt;
  }
  if (n != 1) result[n] = 1;
  return result;
}

int main() {
  int64 N;
  cin >> N;
  if (N == 1) {
    cout << 0 << endl;
    return 0;
  }
  map<int64, int> mp;
  mp = prime_fact(N);
  if (mp.size() == 0) {
    cout << 1 << endl;
    return 0;
  }
  debug(mp);
  int64 cnt = 0;
  int64 minkey = 0;
  int64 minvalue = 0;
  vector<int64> delete_key;
  while (N > 1 & mp.size() > 0) {
    minkey = mp.begin()->first;
    minvalue = mp.begin()->second;
    debug(N);
    debug(mp);
    N /= minkey;
    for (int64 i = 2; i < minvalue; i++) {
      mp[pow(minkey, i)] = 1;
    }
    mp.erase(minkey);
    cnt++;
    if (mp.size() == 0) {
      cout << cnt << endl;
      return 0;
    }
    delete_key = {};
    for (auto p : mp) {
      minkey = p.first;
      if (N % minkey != 0) {
        delete_key.push_back(minkey);
      }
    }
    for (int64 i = 0; i < delete_key.size(); i++) {
      mp.erase(delete_key[i]);
    }
    debug(N);
    debug(mp);
    debug(' ');
  }
  cout << cnt << endl;
  return 0;
}

Measured memory_bytes: 4112