#include <iostream>
#include <vector>
#include <map>
#include <cmath>
using namespace std;

vector<uint64_t> divisor(uint64_t N)
{
    vector<uint64_t> ret;
    for (uint64_t i = 1; i * i <= N; i++) {
        if (N % i == 0) {
            ret.push_back(i);
            if (i * i != N) ret.push_back(N / i);
        }
    }
    sort(ret.begin(), ret.end());
    return ret;
}


bool ruijyo(uint64_t v)
{
    bool ret = false;
    
    map<uint64_t, uint64_t> m;
    uint64_t a = 2;
    while(v >= a * a) {
        if (v % a == 0) {
            v /= a;
            m[a] = 1;
        }else {
            a++;
        }
    }
    
    if (v != 1) {
        m[v] = 1;
    }
    
    if(m.size() == 1) {
        ret = true;
    }
    return ret;
}

int main(int argc, const char * argv[]) {
    uint64_t N;
    cin >> N;
    uint64_t ans = 0;
    
    map<uint64_t, bool> z;
    while (N > 1) {
        vector<uint64_t> d = divisor(N);
        
        bool success = false;
        
        for (uint64_t v : d) {
            if (v == 1) {
                continue;
            }
            // vが素数の累乗か判断する。
            if (ruijyo(v)) {
                if (z.count(v) == 0) {
                    z[v] = true;
                    N /= v;
                    ans++;
                    success = true;
                    break;
                }
            }
        }
        
        if (!success) {
            break;
        }
        
    }
    std::cout << ans;
    
    return 0;
}