#define _CRT_SECURE_NO_WARNINGS

#include <bits/stdc++.h>
#include <random>
using namespace std;

typedef unsigned int uint;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef map<int, int> mii;
typedef map<string, int> msi;
typedef map<int, string> mis;
typedef pair<int, ii> edge;


#define sc(x)  scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define mem(arr,val) memset(arr,val,sizeof arr)
#define sz(v) (int)v.size()
#define rsz(v) v.resize
#define clr(v) v.clear()
#define rev(v) reverse(all(v))
#define lop(i,end) for(int i=0; i<end; i++)
#define rlop(i,start) for(int i=start-1; i>=0; i--)
#define loop(i,start,end) for(int i=start; i<end; i++)
#define rloop(i,start,end) for(int i=start-1; i>=end; i--)
#define PB push_back
#define pb pop_back
#define mP make_pair
#define f first
#define s second

const ll OO = (ll)(4e18) + 9;
const int MOD = (int)(1e9) + 7;
const int oo = 2147483647;
const double EPS = 1e-8;
const double PI = acos(-1.0);

//enum dir { d, r, u, l , dr, ur, dl, ul };
int dx[] = { 1, 0, -1, 0, 1, -1, 1, -1 };
int dy[] = { 0, 1, 0, -1, 1, 1, -1, -1 };

string abc = "abcdefghijklmnopqrstuvwxyz";
string vowels = "aeiouy"; //and sometimes "aeiouy"

template<typename X, typename Y> bool ckmin(X& a, Y b) { return a > b ? a = b, true : false; }
template<typename X, typename Y> bool ckmax(X& a, Y b) { return a < b ? a = b, true : false; }

int dcmp(ld d1, ld d2) { return fabs(d1 - d2) <= EPS ? 0 : d1 > d2 ? 1 : -1; } //Compare Double Numbers
ll gcd(ll x, ll y) { return !y ? x : gcd(y, x%y); }
ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); }
//convert index from 2D array to 1D array. (Zero-indexed)
int conv_2_1(int r, int c, int nCol) { return (nCol*r) + c + 1; }
//convert index from 1D array to 2D array. (Zero-indexed)
ii conv_1_2(int n, int nCol) {
	int r = n / nCol, c = n % nCol;
	return ii(r, c);
}

void inter(string s) {
	cout << s << endl;
	fflush(stdout);
}


ll power(ll base, ll exp) {
	ll ans = 1;
	base %= MOD;
	while (exp > 0) {
		if (exp & 1) ans = (ans * base) % MOD;
		exp >>= 1;
		base = (base * base) % MOD;
	}
	return ans;
}

const int NN = 2e6 + 10;
ll fact[NN];

void init() {
	fact[0] = 1;
	for (int i = 1; i < NN; ++i) fact[i] = (fact[i - 1] * 1LL * i) % MOD;
}

ll nCr(ll n, ll r) {
	auto modInverse = [](ll a) { 
		return power(a, MOD - 2); 
	};
	return (fact[n] * modInverse(fact[r] * 1LL * fact[n - r])) % MOD;
}

ll _sieve_size = 1001000;
bitset<1001000> bs;
vll primes;

void sieve() {
	bs.set();
	bs[0] = bs[1] = 0;
	for (ll i = 2; i < _sieve_size; i++) if (bs[i]) {
		for (ll j = i * i; j < _sieve_size; j += i) bs[j] = 0;
		primes.push_back(i);
	}
}

bool isPrime(ll N) {
	if (N < _sieve_size) return bs[N];
	for (int i = 0; i < sz(primes); i++)
		if (N % primes[i] == 0) return false;
	return true;
}

vector<pair<ll, int>> primeFactors(ll N) {
	vector<pair<ll, int>> factors;
	ll PF_idx = 0, PF = primes[PF_idx]; // primes has been populated by sieve
	while (PF * PF <= N) {
		if (N%PF == 0) N /= PF, factors.push_back({ PF, 1 });
		while (N % PF == 0) { N /= PF; factors.back().second++; }
		PF = primes[++PF_idx];
	}
	if (N != 1) factors.push_back({ N, 1 }); // special case if N is a prime
	return factors;
}


int main()
{
#ifndef ONLINE_JUDGE

#else
	//freopen("pyramid.in", "r", stdin);
#endif
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	ios_base::sync_with_stdio(false);
	sieve();
	cin.tie(NULL);
	ll N;
	cin >> N;
	int cnt = 0;
	map<ll, int> used;
	while (N > 1) {
		vector<pair<ll, int>> ret = primeFactors(N);
		bool found = false;
		for (auto p : ret) {
			ll prime = p.first;
			int n = p.second;
			ll num = prime;
			lop(i, n) {
				if (not used[num]) break;
				if(i < n - 1) num *= prime;
			}
			if (not used[num]) {
				used[num]++;
				N /= num;
				cnt++;
				found = true;
				break;
			}
		}
		if (not found) break;
	}
	cout << cnt << endl;

	return 0;
}


Measured memory_bytes: 4364