#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("-O3")
#define ll long long  int
// #include <boost/multiprecision/cpp_int.hpp>
// using boost::multiprecision::cpp_int;
// cpp_int x;
// namespace mp=boost::multiprecision;
// mp::cpp_int s=n;
#define all(x) (x).begin(), (x).end()
using ld = long double;
const ll mod = 1000000007;
const ll inf = 1000000000000000000;
const ll rk = 256;
const ld PI = 3.141592653589793;
#define pb push_back
#define mp make_pair
#define vc vector
#define fs first
#define sec second
// #define pq priority_queue
#define lb lower_bound
#define ub upper_bound
#define pll pair<ll,ll>
#define pls pair<ll,string>
#define psl pair<string,ll>
#define plc pair<ll,char>
#define pcl pair<char,ll>
#define pss pair<string,string>
#define all(x) (x).begin(), (x).end()
#define tol(s) transform(s.begin(),s.end(),s.begin(),::tolower);
#define tou(s) transform(s.begin(),s.end(),s.begin(),::toupper);
#define print(a) for(auto j:a) {cout<<j<<",";} cout << "\n";
#define endl '\n'
#define FastIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
// getting string line
// getline(cin,word);

// STL:
//        (1) PRIORITY_QUEUE pq:
//        -> priority_queue < int > pq; // max_heap
//        -> priority_queue < int , vector < int > , greater < int > > pq; // min_heap
//        -> pq.top()   --> returns the maximum or minimum element
//        -> pq.push()  --> push element into the queue
//        -> pq.pop()   --> remove top most element
//        -> pq.empty() --> checks whether queue is empty or not

//        (2) set / multiset  ss;
//        --> ss.insert(key); (insertion)
//        --> ss.erase(ss.find(key)) .. (deletion)
//        --> ss.find(key) != ss.end() ..existence check
//        --> ss.lower_bound(x) -> smallest value which is greater than or equals to x
//        --> ss.upper_bound(x) --> first value strictly greater than x
//        --> multiset< data_type , greater<data_type> > ms; // for max ordering

//        (3) common functions
//        lower_bound(v.begin(),v.end(),x) - v.begin() --> smallest value greater than or equals to x
//        upper_bound(v.begin(), v.end(),x)- v.begin() --> smallest value greater than x
//        memset(dp , val , sizeof(dp)) -> sets the value of array dp to val

//        (4)  common mistakes
//            .) long long vs int overflow
//            .) read question carefully please!!!! it can cost you a lot
//            .) unorderedmap is O(1) look up but worst case can be bad
//            .) maps have higher constant so many lookups can cause TLE
//            .) leaving debugs or cerrs in the program at times can cause TLE


ostream & operator << (ostream & os, pair <ll, ll> const& x) {
    os << x.first << "," << x.second;
    return os;
}

template <class T>
ostream & operator << (ostream & os, vector <T> const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ";
    return os << "}";
}

template <class T>
ostream & operator << (ostream & os, set <T> const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ";
    return os << "}";
}

template <class Ch, class Tr, class Container>
basic_ostream <Ch, Tr> & operator << (basic_ostream <Ch, Tr> & os, Container const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ";
    return os << "}";
}

template <class X, class Y>
ostream & operator << (ostream & os, pair <X, Y> const& p) {
    return os << "[ " << p.first << ", " << p.second << "]" ;
}

struct comp {
    bool operator()(int const &i, int const &j) const {
        return i > j;
    }
};

struct Triplet{
    ll x,y,z;
};

ll modularexpo(ll x,ll n,ll mod){
    ll res = 1;
    while(n>0){
        if(n%2==1)
            res = (res*x)%mod;
        x = (x*x)%mod;
        n = n/2;
    }
    return res;
}

vc<ll> primes;

void func(ll n){
    if(n %2==0){
        ll count = 0;
        while(n % 2 == 0){
            count++;
            n = n/2;
        }
        primes.pb(count);
    }
    for(ll i = 3; i <= sqrt(n); i += 2){
        if(n % i == 0){
            ll count = 0;
            while(n % i == 0){
                count++;
                n /= i;
            }
            primes.pb(count);
        }
    }
    if(n > 1)
        primes.pb(1);
    
}

int main(){
    FastIO;
// #ifndef ONLINE_JUDGE
//     // for getting input from input.txt
//     freopen("input.txt", "r", stdin);
//     // for writing output to output.txt
//     freopen("output.txt", "w", stdout);
// #endif
    ll n;
    cin>>n;
    func(n);
    ll ans = 0;
    for(ll x: primes){
        ll res = (-1 + (ll)sqrt(1+8*x))/2;
        ans += res;
    }
    cout<<ans<<endl;
    return 0;
}



Measured memory_bytes: 3700