use_list = []





def make_prime(n):

    array = {}

    temp = n

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

        if temp % i == 0:

            cnt = 0

            while temp % i == 0:

                cnt = cnt + 1

                temp = temp // i

            array[i] = cnt



    if temp != 1:

        array[temp] = 1



    if array == {}:

        array[n] = 1



    return array





def div_prime(n, count):



    if n == 1:

        return count



    # 素数一覧を取得

    prime_list = make_prime(n)

    for p, e in list(prime_list.items()):

        for i in range(1, e + 1):

            if not p ** i in use_list:

                z = p ** i

                use_list.append(z)

                return div_prime(int(n / z), count + 1)



    return count





N = int(eval(input()))

print((div_prime(N, 0)))

import math

import sys

from collections import Counter



import time



N = int(eval(input()))

Ns = N





def create_sosu(n, max, Nso):

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

        if n % i == 0:

            while n % i == 0:

                n = n // i

                Nso.append(i)

            return create_sosu(n, int(math.sqrt(n)), Nso)



    # 最後まで来た場合 = その値が素数の場合

    # ただし1は素数ではない

    if n != 1:

        Nso.append(n)

    return Nso





def execute_answer(n, kv):

    # 設問の操作をしていきます

    x = 0

    count = 0

    xcount = 0

    while n > 1 and x <= len(kv):

        for x in list(kv.keys()):

            for y in range(1, kv[x]+1, +1):

                if n % (x**y) == 0:

                    count = count+1

                    n = n//(x**y)

                    xcount = xcount+y

                else:

                    break

    print(count)





def main():



    # Nが1の場合にはそのまま終了

    if N == 1:

        print((0))

        return



    # Nが1以外の場合

    # 素数一覧を作成する

    Nso = create_sosu(N, int(math.sqrt(N)), [])

    execute_answer(Ns, Counter(Nso))





main()

use_list = []


def make_prime(n):
    array = {}
    temp = n
    for i in range(2, int(-(-(n**0.5) // 1)) + 1):
        if temp % i == 0:
            cnt = 0
            while temp % i == 0:
                cnt = cnt + 1
                temp = temp // i
            array[i] = cnt
    if temp != 1:
        array[temp] = 1
    if array == {}:
        array[n] = 1
    return array


def div_prime(n, count):
    if n == 1:
        return count
    # 素数一覧を取得
    prime_list = make_prime(n)
    for p, e in list(prime_list.items()):
        for i in range(1, e + 1):
            if not p**i in use_list:
                z = p**i
                use_list.append(z)
                return div_prime(int(n / z), count + 1)
    return count


N = int(eval(input()))
print((div_prime(N, 0)))

import math
import sys
from collections import Counter
import time

N = int(eval(input()))
Ns = N


def create_sosu(n, max, Nso):
    for i in range(2, max + 1):
        if n % i == 0:
            while n % i == 0:
                n = n // i
                Nso.append(i)
            return create_sosu(n, int(math.sqrt(n)), Nso)
    # 最後まで来た場合 = その値が素数の場合
    # ただし1は素数ではない
    if n != 1:
        Nso.append(n)
    return Nso


def execute_answer(n, kv):
    # 設問の操作をしていきます
    x = 0
    count = 0
    xcount = 0
    while n > 1 and x <= len(kv):
        for x in list(kv.keys()):
            for y in range(1, kv[x] + 1, +1):
                if n % (x**y) == 0:
                    count = count + 1
                    n = n // (x**y)
                    xcount = xcount + y
                else:
                    break
    print(count)


def main():
    # Nが1の場合にはそのまま終了
    if N == 1:
        print((0))
        return
    # Nが1以外の場合
    # 素数一覧を作成する
    Nso = create_sosu(N, int(math.sqrt(N)), [])
    execute_answer(Ns, Counter(Nso))


main()

-use_list = [] +import math +import sys +from collections import Counter +import time + +N = int(eval(input())) +Ns = N -def make_prime(n): -    array = {} -    temp = n -    for i in range(2, int(-(-(n**0.5) // 1)) + 1): -        if temp % i == 0: -            cnt = 0 -            while temp % i == 0: -                cnt = cnt + 1 -                temp = temp // i -            array[i] = cnt -    if temp != 1: -        array[temp] = 1 -    if array == {}: -        array[n] = 1 -    return array +def create_sosu(n, max, Nso): +    for i in range(2, max + 1): +        if n % i == 0: +            while n % i == 0: +                n = n // i +                Nso.append(i) +            return create_sosu(n, int(math.sqrt(n)), Nso) +    # 最後まで来た場合 = その値が素数の場合 +    # ただし1は素数ではない +    if n != 1: +        Nso.append(n) +    return Nso -def div_prime(n, count): -    if n == 1: -        return count -    # 素数一覧を取得 -    prime_list = make_prime(n) -    for p, e in list(prime_list.items()): -        for i in range(1, e + 1): -            if not p**i in use_list: -                z = p**i -                use_list.append(z) -                return div_prime(int(n / z), count + 1) -    return count +def execute_answer(n, kv): +    # 設問の操作をしていきます +    x = 0 +    count = 0 +    xcount = 0 +    while n > 1 and x <= len(kv): +        for x in list(kv.keys()): +            for y in range(1, kv[x] + 1, +1): +                if n % (x**y) == 0: +                    count = count + 1 +                    n = n // (x**y) +                    xcount = xcount + y +                else: +                    break +    print(count) -N = int(eval(input())) -print((div_prime(N, 0))) +def main(): +    # Nが1の場合にはそのまま終了 +    if N == 1: +        print((0)) +        return +    # Nが1以外の場合 +    # 素数一覧を作成する +    Nso = create_sosu(N, int(math.sqrt(N)), []) +    execute_answer(Ns, Counter(Nso)) + + +main()