#include <bits/stdc++.h>
#include <time.h>
#include <assert.h>


using namespace std;



#define For(i,x,n)  for(long long i=x;i<n;i++)
#define rFor(i,x,n) for(long long i=x;i>=n;i--)
#define itFor(it,st)   for(auto it=st.begin() ; it!=st.end() ; it++)
#define MOD 1000000007
#define PI 3.141592653589793
#define INF 999999999999999999
#define NAX 1000005
#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define sp " "
#define cont continue
#define brk break

#define deb1(x)                cout<<#x<<": "<<x<<endl
#define deb2(x, y)             cout<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define deb3(x, y, z)          cout<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define deb4(a, b, c, d)       cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
#define deb5(a, b, c, d, e)    cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
#define deb6(a, b, c, d, e, f) cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl

using namespace std;


//---------------------------------------------------------------------------//

bool isprime[NAX];
void sieve()
{
	For(i,2,NAX)
	isprime[i]=true;

	for(ll i=2;i*i<NAX;i++)
    {
      	if(isprime[i]==true) 
      	{
      		for(ll j=i*i;j<NAX;j+=i)
      		isprime[j]=false;
      	}
    }
}

vector<ll> getprime()
{
	sieve();
	
	vector<ll> prime;
	For(i,0,NAX)
	if(isprime[i]==true)
	prime.pb(i);
	
	return prime;
}

//---------------------------------------------------------------------------//



int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cout<<fixed;
    cout<<setprecision(8);
    srand(time(NULL));

	ll n;
	cin>>n;
	vector<ll> allp = getprime();
	if(n==1){
		cout<<0;
		return 0;
	}
	ll ans = 0;
	vector<ll> fact;
	while(n != 1){
		ll get=-1;
		ll rt = (ll)(sqrt(n)+0.0001);
		For(i,0,allp.size()){
			if(allp[i] > rt)
				break;
			if(n%allp[i]==0){
				get = allp[i];
				break;
			}
		}
		if(get == -1){
			fact.pb(n);
			break;
		}
		fact.pb(get);
		n = n/get;
	}	
	map<ll,ll> hm;
	For(i,0,fact.size())
		hm[fact[i]]++;
	set<pair<ll,ll> > st;
	ll sm = 0;
	For(i,1,200){
		sm += i;
		st.insert(make_pair(sm,i));
	}
	for(map<ll,ll> :: iterator it = hm.begin() ; it!=hm.end() ; it++){
		ll key = it->first;
		ll cnt = it->second;
		// deb2(key,cnt);
		pair<ll,ll> tmp = make_pair(cnt,0);
		set<pair<ll,ll> > :: iterator itr = st.lower_bound(tmp);
		if((*itr).first == cnt)
			ans += (*itr).second;
		else{
			--itr;
			ans += (*itr).second;
		}
	}
	cout<<ans;

    // cout<<"\nTime used = "<<static_cast<double>(clock())/(CLOCKS_PER_SEC)<<"s"<<endl;  // - for checking time used for a test case
    return 0;
}

//s1.substr(1,3) - return 3 characters starting from position 1 as substring of string sz1. eg sz1="shreynumh" sz1.substr(2,5)="reyan"
//num = atoi(s.c_str()); //convert string s to integer num
//n.erase(i,std::string::npos); //erase i th position in string n , decreasing string size
//s.find(b)!= std::string::npos - finds string b in string a - true if found
//cout<<"Time used = "<<static_cast<double>(clock())/(CLOCKS_PER_SEC)<<"s"<<endl;  // - for checking time used for a test case                


Measured memory_bytes: 5268