def sieve(x):

    """

    Sieve of Eratosthenes

    :param x: max value

    :return: list of bool

    """



    is_prime = [True] * (x + 1)

    is_prime[0] = is_prime[1] = False



    for i in range(2, x + 1):

        if is_prime[i]:

            for j in range(i * 2, x + 1, i):

                is_prime[j] = False



    return is_prime





n = int(eval(input()))



is_prime = sieve(10 ** 6)

primes = [i for i, e in enumerate(is_prime) if e]



ans = 0

for e in primes:

    div = e

    while n % div == 0:

        n //= div

        ans += 1

        div *= e



    while n % e == 0:

        n //= e



ans += n != 1



print(ans)

from math import sqrt

from collections import defaultdict



n = int(eval(input()))



d = defaultdict(int)

for i in range(2, int(sqrt(n)) + 10):

    while n % i == 0:

        d[i] += 1

        n //= i



if n != 1:

    d[n] += 1



ans = 0

for v in list(d.values()):

    mn = 1

    while v >= mn:

        v -= mn

        ans += 1

        mn += 1



print(ans)

def sieve(x):
    """
    Sieve of Eratosthenes
    :param x: max value
    :return: list of bool
    """
    is_prime = [True] * (x + 1)
    is_prime[0] = is_prime[1] = False
    for i in range(2, x + 1):
        if is_prime[i]:
            for j in range(i * 2, x + 1, i):
                is_prime[j] = False
    return is_prime


n = int(eval(input()))
is_prime = sieve(10**6)
primes = [i for i, e in enumerate(is_prime) if e]
ans = 0
for e in primes:
    div = e
    while n % div == 0:
        n //= div
        ans += 1
        div *= e
    while n % e == 0:
        n //= e
ans += n != 1
print(ans)

from math import sqrt
from collections import defaultdict

n = int(eval(input()))
d = defaultdict(int)
for i in range(2, int(sqrt(n)) + 10):
    while n % i == 0:
        d[i] += 1
        n //= i
if n != 1:
    d[n] += 1
ans = 0
for v in list(d.values()):
    mn = 1
    while v >= mn:
        v -= mn
        ans += 1
        mn += 1
print(ans)

-def sieve(x): -    """ -    Sieve of Eratosthenes -    :param x: max value -    :return: list of bool -    """ -    is_prime = [True] * (x + 1) -    is_prime[0] = is_prime[1] = False -    for i in range(2, x + 1): -        if is_prime[i]: -            for j in range(i * 2, x + 1, i): -                is_prime[j] = False -    return is_prime - +from math import sqrt +from collections import defaultdict -is_prime = sieve(10**6) -primes = [i for i, e in enumerate(is_prime) if e] +d = defaultdict(int) +for i in range(2, int(sqrt(n)) + 10): +    while n % i == 0: +        d[i] += 1 +        n //= i +if n != 1: +    d[n] += 1 -for e in primes: -    div = e -    while n % div == 0: -        n //= div +for v in list(d.values()): +    mn = 1 +    while v >= mn: +        v -= mn -        div *= e -    while n % e == 0: -        n //= e -ans += n != 1 +        mn += 1