#約数

def make_divisors(n): #約数をリストで返す

    divisors = []

    for i in range(1, int(n**0.5)+1):

        if n % i == 0:

            divisors.append(i)

            if i != n // i:

                divisors.append(n//i)



    # divisors.sort()

    return divisors



#素因数分解

def soinsu_bunkai(m):

    pf={}



    for i in range(2,int(m**0.5)+1):

        while m%i==0:

            pf[i]=pf.get(i,0)+1

            m//=i

    if m>1:

        pf[m]=1

    return pf



#初期入力

N = int(eval(input()))

div =make_divisors(N) #Nの約数

div.sort()

div_1_except=div[1:]

count =0

for i in div_1_except:

    q,mod= divmod(N,i)

    if mod ==0:

        ii =soinsu_bunkai(i) #Nの約数を素因数分解

        if len(ii) ==1 :

            count +=1

            N =q   



print(count)
#約数は使わず、素因数分解のみ



#素因数分解

def soinsu_bunkai(m):

    pf={}



    for i in range(2,int(m**0.5)+1):

        while m%i==0:

            pf[i]=pf.get(i,0)+1

            m//=i

    if m>1:

        pf[m]=1

    return pf



#初期入力

N = int(eval(input()))

xx =[]

prime_factorization =soinsu_bunkai(N)

count =0

for i in list(prime_factorization.keys()):

    x=1

    while x <= prime_factorization[i]:

        if N % i**x ==0:

            xx.append(i**x)

            count +=1

            N //= i**x

        x +=1

print(count)
# 約数
def make_divisors(n):  # 約数をリストで返す
    divisors = []
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    # divisors.sort()
    return divisors


# 素因数分解
def soinsu_bunkai(m):
    pf = {}
    for i in range(2, int(m**0.5) + 1):
        while m % i == 0:
            pf[i] = pf.get(i, 0) + 1
            m //= i
    if m > 1:
        pf[m] = 1
    return pf


# 初期入力
N = int(eval(input()))
div = make_divisors(N)  # Nの約数
div.sort()
div_1_except = div[1:]
count = 0
for i in div_1_except:
    q, mod = divmod(N, i)
    if mod == 0:
        ii = soinsu_bunkai(i)  # Nの約数を素因数分解
        if len(ii) == 1:
            count += 1
            N = q
print(count)

# 約数は使わず、素因数分解のみ
# 素因数分解
def soinsu_bunkai(m):
    pf = {}
    for i in range(2, int(m**0.5) + 1):
        while m % i == 0:
            pf[i] = pf.get(i, 0) + 1
            m //= i
    if m > 1:
        pf[m] = 1
    return pf


# 初期入力
N = int(eval(input()))
xx = []
prime_factorization = soinsu_bunkai(N)
count = 0
for i in list(prime_factorization.keys()):
    x = 1
    while x <= prime_factorization[i]:
        if N % i**x == 0:
            xx.append(i**x)
            count += 1
            N //= i**x
        x += 1
print(count)

-# 約数 -def make_divisors(n):  # 約数をリストで返す -    divisors = [] -    for i in range(1, int(n**0.5) + 1): -        if n % i == 0: -            divisors.append(i) -            if i != n // i: -                divisors.append(n // i) -    # divisors.sort() -    return divisors - - +# 約数は使わず、素因数分解のみ -div = make_divisors(N)  # Nの約数 -div.sort() -div_1_except = div[1:] +xx = [] +prime_factorization = soinsu_bunkai(N) -for i in div_1_except: -    q, mod = divmod(N, i) -    if mod == 0: -        ii = soinsu_bunkai(i)  # Nの約数を素因数分解 -        if len(ii) == 1: +for i in list(prime_factorization.keys()): +    x = 1 +    while x <= prime_factorization[i]: +        if N % i**x == 0: +            xx.append(i**x) -            N = q +            N //= i**x +        x += 1