Problem:
Score : 400 points

Problem Statement

Given is a positive integer N. Consider repeatedly applying the operation below on N:

First, choose a positive integer z satisfying all of the conditions below:

z can be represented as z=p^e, where p is a prime number and e is a positive integer;

z divides N;

z is different from all integers chosen in previous operations.

Then, replace N with N/z.

Find the maximum number of times the operation can be applied.

Constraints

All values in input are integers.

1 \leq N \leq 10^{12}

Input

Input is given from Standard Input in the following format:

N

Output

Print the maximum number of times the operation can be applied.

Sample Input 1

24

Sample Output 1

3

We can apply the operation three times by, for example, making the following choices:

Choose z=2 (=2^1). (Now we have N=12.)

Choose z=3 (=3^1). (Now we have N=4.)

Choose z=4 (=2^2). (Now we have N=1.)

Sample Input 2

1

Sample Output 2

0

We cannot apply the operation at all.

Sample Input 3

64

Sample Output 3

3

We can apply the operation three times by, for example, making the following choices:

Choose z=2 (=2^1). (Now we have N=32.)

Choose z=4 (=2^2). (Now we have N=8.)

Choose z=8 (=2^3). (Now we have N=1.)

Sample Input 4

1000000007

Sample Output 4

1

We can apply the operation once by, for example, making the following choice:

z=1000000007 (=1000000007^1). (Now we have N=1.)

Sample Input 5

997764507000

Sample Output 5

7

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <cstdint>
#include <numeric>
#include <cmath>

#define INF 1000000000
#define INF2 100000000000
#define LLINF 1000000000000000000
#define MOD 1000000007
using namespace std;
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define LOOP(i,N) for(int i=0;i<N;i++)
#define LOOP1(i,N) for(int i=1;i<=N;i++)
typedef pair<int,int> P;
typedef pair<int,pair<int,int> > PP;
#define int long long


const int N = 1000000 /*値*/;
void eratosthenes(bool prime[N]){
    LOOP(i,N) prime[i] = 1;
    prime[0] = prime[1] = 0;
    LOOP(i,N){
        if(prime[i]){
            for(int j = i + i; j < N; j+=i){
                prime[j] = 0;
            }
        }
    }
}

signed main(){
  bool isprime[N];
  eratosthenes(isprime);
  int n;
  cin >> n;
  int su = 0;
  vector<int> prime;
  FOR(i,2,sqrt(n)+1){
    // cerr << "?" << endl;
    if(!isprime[i]){
      continue;
    }
    // prime.push_back(i);
    int cnt = 0;
    int tmp = n;
    while(true){
      if(tmp%i == 0){
        cnt++;
        tmp/=i;
      }else{
        break;
      }
    }
    int ans = 0;
    while(cnt){
      if(cnt >= (ans+1)){
        ans ++;
        cnt -= ans;
      }else{
        break;
      }
    }
    if(ans != 0)
      cerr << i << ":" << ans << endl;
    su += ans;
  }
  if(su == 0){
    if(n == 1){
      cout << 0 << endl;
      return 0;
    }
    cout << 1 << endl;
  }else{
    cout << su << endl;
  }
}