#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
typedef vector<ll> vl;
typedef vector<ull> vul;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<ll>> vvl;
typedef vector<vector<string>> vvs;
typedef vector<vector<ull>> vvul;
typedef vector<bool> vb;
const ll md = 1000000007;

ll add(ll a, ll b, ll mod = md) {
    return (a%mod + b%mod + mod)%mod;
}

ll mul(ll a, ll b, ll mod = md) {
    return (a%mod * b%mod)%mod;
}

ll fn(ll st, ll d, ll tm, ll mod = md) {
    ll res = 1, x = d%mod;
    ll ans = 0;
    while(tm) {
        if(tm&1) ans = (x*ans + res)%mod;
        res = ((res*x)%mod + res%mod)%mod;
        x = (x*x)%mod;
        tm = tm/2;
    }
    ans = (ans*st)%mod;
    return ans;
}

ll C(vl &fact, vl &invfact, ll n, ll r) {
    if(r == 0) return 1;
    ll num = fact[n];
    ll den = mul(invfact[r], invfact[n-r]);
    return mul(num, den);
}

ll mulm(ll a, ll b, ll mod = md) {
    ll r = 0;
    a %= mod;
    while (b) {
        if (b & 1) r = (r+a)%mod;
        a = (a+a)%mod;
        b = b/2;
    }
    r %= mod;
    return r;
}

ll power(ll x, ll n, ll mod = md) {
    ll res = 1;
    x %= mod;
    while (n) {
        if (n & 1)  res = (res*x)%mod;
        n = n/2;
        x = (x*x)%mod;
    }
    return res;
}

ll power2(ll x, ll n) {
    ll res = 1;
    while (n) {  
        if (n & 1) res = (res*x);
        n = n/2;
        x = (x*x);
    }  
    return res;
}

bool is_prime(ll x) {
    if(x == 1 || x == 0) return false;
    for(int i=2; i*i <= x; i++) {
        if(x%i == 0) return false;
    }
    return true;
}

ll compgcd(ll n, vector<ll> const &primes) { 
    ll res = n; 
    for (ll i=0; primes[i]*primes[i] <= n; i++) {
        if (n % primes[i]== 0) { 
            res -= (res / primes[i]); 
            while (n%primes[i]== 0) {
               n/=primes[i]; 
            }
        } 
    } 
    if (n > 1) {
       res -= (res / n); 
    }
    return res; 
}

void sieve(vector<bool> &prime, vector<ll> &primes, ll lim) {
    for(int i = 2; i*i <= lim; i++) {
        if(prime[i]) {
            for(int j = 2; j*i <= lim; j++) {
                prime[j*i] = false;
            }
        }
    }
    for(int i = 2; i <= lim; i++) {
        if(prime[i]) {
            primes.push_back(i);
        }
    }
}

void sieveGCD(ll lim, vector<ll> &tab, vector<ll> const &primes) {
    for(int  i = 1; i <= lim; i++) {
        tab[i] = i;
    }
    for(int i = 0; i<primes.size() && primes[i] <= lim; i++) {
        tab[primes[i]] = primes[i]-1;
        for(int j = 2; primes[i]*j <= lim; j++) {
            tab[primes[i]*j] = (tab[primes[i]*j]/primes[i])*(primes[i]-1);
        }
    }
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	// freopen("input.txt", "r", stdin);
	vb prime(1e6+100, true);
	vl primes;
	sieve(prime, primes, 1e6+5);
		ll n;
		cin >> n;
		vector<pair<ll,ll>> fact;
		int pn = primes.size();
		ll nn = n;
		for(int i = 0; i < pn && primes[i]*primes[i] <= n; i++) {
			if(nn%primes[i] == 0) {
				ll cnt = 0;
				while(nn%primes[i] == 0) {
					nn /= primes[i];
					cnt++;
				}
				fact.push_back(make_pair(primes[i], cnt));
			}
		}
		if(nn > 1) {
			fact.push_back(make_pair(nn, 1));
		}
		ll cnt = 0;
		int fs = fact.size();
		map<ll,bool> used;
		// for(int i = 0; i < fs; i++) {
		// 	cout << fact[i].first << " " << fact[i].second << "\n";
		// }
		// cout << "\n";
		while(n > 1) {
			ll lo = 1e15;
			for(int i = 0; i < fs; i++) {
				for(int j = 1; j <= fact[i].second; j++) {
					ll cur = power2(fact[i].first, j);
					if(!used[cur] && n%cur == 0) {
						lo = min(lo, cur);
					}
				}
			}
			for(int i = 0; i < fs; i++) {
				for(int j = 1; j <= fact[i].second; j++) {
					ll cur = power2(fact[i].first, j);
					if(!used[cur] && lo == cur) {
						used[cur] = true;
					}
				}	
			}
			if(n%lo == 0) {
				// cout << lo << "\n";
				n /= lo;
				cnt++;
			} else {
				break;
			}
		}
		cout << cnt << "\n";
	return 0;
}

Measured memory_bytes: 4304