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: Time Limit Exceeded)

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <math.h>
int AKITONDEBUG=0;
 using namespace std;

int roundup(float x);
int Akiton(long unsigned int n);


int main(){
vector<int>div_num;
long int maxNum=1;
long unsigned int i=2;
long unsigned int n;
cin >> n;
if(n==1)maxNum=0;
else if(Akiton(n)==0&&n!=1){
maxNum--;
	if(n%i==0){
		int k=1;
		for(k=1;(n/int(pow(i*1.0,k)))%i==0;k++)k+=0;
		int tempnum=int((-1+sqrt((1+8*k)*1.0))/2);
		maxNum+=tempnum;
		n=n/pow(i*1.0,k);
		
	}

for(i=3;i<=n;i+=2){
	if(n%i==0){
		int k=1;
		for(k=1;(n/int(pow(i*1.0,k)))%i==0;k++)k+=0;
		//div_num.push_back(k);
		int tempnum=int((-1+sqrt((1+8*k)*1.0))/2);
		maxNum+=tempnum;
		n=n/pow(i*1.0,k);
		
	}

 
}
}
cout << maxNum;
  return 0;
}




int Akiton(long unsigned int n){
int AnswerCounter[3]={-1,-1,-1};
int m;

if(n==1)return 0;
if(n==2||n==3||n==5)return 1;
if(sqrt(n*1.0)==(long unsigned int)sqrt(n*1.0)){
    if(AKITONDEBUG==1)printf("Not Prime\n");
    return 0;
}
m=(int)n%12;


if(m==1||m==5){
   // printf("Coming At1,5 pow(n,1/2):%f\n",sqrt(n));
for(int x=1;x<=sqrt(n*1.0)/2;x++){
    //printf("pow(n-x*x*4,1/2):%d\n",pow(n-x*x*4,1/2));
    if(sqrt(n*1.0-x*x*4)==(long unsigned int)sqrt(n*1.0-x*x*4))

{AnswerCounter[0]=AnswerCounter[0]*-1;}
}
//printf("AnswerCounter[0]:%d\n",AnswerCounter[0]);
if(AnswerCounter[0]==1){
    if(AKITONDEBUG==1)printf("PrimeNumber");
    return 1;
}
}else if(m==7){
     //printf("Coming At7,11\n");
for(int x=1;x<=sqrt(n*1.0)/sqrt(3.0);x++){
    if(sqrt(n*1.0-x*x*3)==(long unsigned int)sqrt(n*1.0-x*x*3)){
        AnswerCounter[1]=AnswerCounter[1]*-1;

    }
}
//printf("AnswerCounter[1]:%d\n",AnswerCounter[1]);

if(AnswerCounter[1]==1){
   if(AKITONDEBUG==1) printf("PrimeNumber");
    return 1;
}

}else if(m==11){

for(int x=roundup(sqrt(n*1.0/3));x<=sqrt(n*1.0/2);x++){
    if(sqrt(x*x*3-n*1.0)==(long unsigned int)sqrt(x*x*3-n*1.0)){
        AnswerCounter[2]=AnswerCounter[2]*-1;

    }

if(AnswerCounter[2]==1){
   if(AKITONDEBUG==1)printf("PrimeNumber\n");
    return 1;
}
}



}
   if(AKITONDEBUG==1)printf("Not Prime m:%d",m);
return 0;
}

int roundup(float x){
    if(x==(int)x)return (int)x;
    else return (int)x+1;

}