A,B = list(map(int, input().split()))



#解法の大まかな流れ

#　AとBの素因数をそれぞれ計算し、And集合の長さを出す



#　数Nの素因数の算出方法

#  基本的には、Nを小さい数から順に割れるだけ割っていく（除算法）

#    割る数は素数だけでいい

# 課題：1～Aまでそれぞれ割って判定では計算量が足りない　A <= 10^12なので

# アイディア①：素数一覧表を作成して、一覧表に入っている数字だけで、割れるか判定

#  ⇒ 素数一覧表の作成の方が高コストになる可能性高い

# アイディア②： eratosthenesの篩の応用





def Soinsu(N):

    soinsu = set([1]) 

    if N > 1:

        # 偶数チェック（ここで引っ掛けられると割る数のカウントアップを倍にできるので)

        div2_flg = 1

        while div2_flg:

            if N % 2 == 0:

                soinsu.add(2)

                N = N/2

            else:

                div2_flg = 0

#         print("after 2: ",N)

        for i in range(3,int(N)+1,2):

#             print("i: ",i, " N: ",N)

        

            div_flg = 1

            while div_flg:

#                 print("   N: ",N)

                if N % i == 0:

                    soinsu.add(i)

                    N = N/i

                else:

                    div_flg = 0

            # 割る数の上限はN**(1/2)であることを適用

            if i**2 > N:

                break

        # 自分自身も入れる：これを入れないと片方がもう一方の素因数である場合を逃す

        soinsu.add(N)

        

    return(soinsu)

            

soi_A = Soinsu(A)

soi_B = Soinsu(B)

# print(soi_A)

# print(soi_B)

print((len(soi_A & soi_B)))


from collections import defaultdict as dd

A,B = list(map(int,input().split()))



def get_p(n):

    th = round(n**0.5)

    ans = (n,1)

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

        if n % i ==  0:

            ans = (i,n//i)

            break

    return(ans)

            

def get_yakusu(n):

    flag = 1

    pn_dic = dd(lambda: 0)

    while flag:

        yaku,red = get_p(n)

        if yaku == n:

            pn_dic[str(yaku)] += 1

            flag = 0

        else:

            pn_dic[str(yaku)] += 1

            n = red

    return(pn_dic)



apn_dic = get_yakusu(A)

apn_dic["1"] += 1

bpn_dic = get_yakusu(B)

bpn_dic["1"] += 1



# print("Adic:",apn_dic)

# print("Bdic:",bpn_dic)





kouyaku_dic = dd(lambda:0)



wa_key = list(set(apn_dic.keys()) & set(bpn_dic.keys()))



for key in wa_key:

    kouyaku_dic[key] = min(apn_dic[key],bpn_dic[key])



# print("kouyaku:",kouyaku_dic)    

    

m = len(wa_key)

        

print(m)



A, B = list(map(int, input().split()))
# 解法の大まかな流れ
# 　AとBの素因数をそれぞれ計算し、And集合の長さを出す
# 　数Nの素因数の算出方法
#  基本的には、Nを小さい数から順に割れるだけ割っていく（除算法）
#    割る数は素数だけでいい
# 課題：1～Aまでそれぞれ割って判定では計算量が足りない　A <= 10^12なので
# アイディア①：素数一覧表を作成して、一覧表に入っている数字だけで、割れるか判定
#  ⇒ 素数一覧表の作成の方が高コストになる可能性高い
# アイディア②： eratosthenesの篩の応用
def Soinsu(N):
    soinsu = set([1])
    if N > 1:
        # 偶数チェック（ここで引っ掛けられると割る数のカウントアップを倍にできるので)
        div2_flg = 1
        while div2_flg:
            if N % 2 == 0:
                soinsu.add(2)
                N = N / 2
            else:
                div2_flg = 0
        #         print("after 2: ",N)
        for i in range(3, int(N) + 1, 2):
            #             print("i: ",i, " N: ",N)
            div_flg = 1
            while div_flg:
                #                 print("   N: ",N)
                if N % i == 0:
                    soinsu.add(i)
                    N = N / i
                else:
                    div_flg = 0
            # 割る数の上限はN**(1/2)であることを適用
            if i**2 > N:
                break
        # 自分自身も入れる：これを入れないと片方がもう一方の素因数である場合を逃す
        soinsu.add(N)
    return soinsu


soi_A = Soinsu(A)
soi_B = Soinsu(B)
# print(soi_A)
# print(soi_B)
print((len(soi_A & soi_B)))

from collections import defaultdict as dd

A, B = list(map(int, input().split()))


def get_p(n):
    th = round(n**0.5)
    ans = (n, 1)
    for i in range(2, th + 1):
        if n % i == 0:
            ans = (i, n // i)
            break
    return ans


def get_yakusu(n):
    flag = 1
    pn_dic = dd(lambda: 0)
    while flag:
        yaku, red = get_p(n)
        if yaku == n:
            pn_dic[str(yaku)] += 1
            flag = 0
        else:
            pn_dic[str(yaku)] += 1
            n = red
    return pn_dic


apn_dic = get_yakusu(A)
apn_dic["1"] += 1
bpn_dic = get_yakusu(B)
bpn_dic["1"] += 1
# print("Adic:",apn_dic)
# print("Bdic:",bpn_dic)
kouyaku_dic = dd(lambda: 0)
wa_key = list(set(apn_dic.keys()) & set(bpn_dic.keys()))
for key in wa_key:
    kouyaku_dic[key] = min(apn_dic[key], bpn_dic[key])
# print("kouyaku:",kouyaku_dic)
m = len(wa_key)
print(m)

+from collections import defaultdict as dd + -# 解法の大まかな流れ -# 　AとBの素因数をそれぞれ計算し、And集合の長さを出す -# 　数Nの素因数の算出方法 -#  基本的には、Nを小さい数から順に割れるだけ割っていく（除算法） -#    割る数は素数だけでいい -# 課題：1～Aまでそれぞれ割って判定では計算量が足りない　A <= 10^12なので -# アイディア①：素数一覧表を作成して、一覧表に入っている数字だけで、割れるか判定 -#  ⇒ 素数一覧表の作成の方が高コストになる可能性高い -# アイディア②： eratosthenesの篩の応用 -def Soinsu(N): -    soinsu = set([1]) -    if N > 1: -        # 偶数チェック（ここで引っ掛けられると割る数のカウントアップを倍にできるので) -        div2_flg = 1 -        while div2_flg: -            if N % 2 == 0: -                soinsu.add(2) -                N = N / 2 -            else: -                div2_flg = 0 -        #         print("after 2: ",N) -        for i in range(3, int(N) + 1, 2): -            #             print("i: ",i, " N: ",N) -            div_flg = 1 -            while div_flg: -                #                 print("   N: ",N) -                if N % i == 0: -                    soinsu.add(i) -                    N = N / i -                else: -                    div_flg = 0 -            # 割る数の上限はN**(1/2)であることを適用 -            if i**2 > N: -                break -        # 自分自身も入れる：これを入れないと片方がもう一方の素因数である場合を逃す -        soinsu.add(N) -    return soinsu -soi_A = Soinsu(A) -soi_B = Soinsu(B) -# print(soi_A) -# print(soi_B) -print((len(soi_A & soi_B))) +def get_p(n): +    th = round(n**0.5) +    ans = (n, 1) +    for i in range(2, th + 1): +        if n % i == 0: +            ans = (i, n // i) +            break +    return ans + + +def get_yakusu(n): +    flag = 1 +    pn_dic = dd(lambda: 0) +    while flag: +        yaku, red = get_p(n) +        if yaku == n: +            pn_dic[str(yaku)] += 1 +            flag = 0 +        else: +            pn_dic[str(yaku)] += 1 +            n = red +    return pn_dic + + +apn_dic = get_yakusu(A) +apn_dic["1"] += 1 +bpn_dic = get_yakusu(B) +bpn_dic["1"] += 1 +# print("Adic:",apn_dic) +# print("Bdic:",bpn_dic) +kouyaku_dic = dd(lambda: 0) +wa_key = list(set(apn_dic.keys()) & set(bpn_dic.keys())) +for key in wa_key: +    kouyaku_dic[key] = min(apn_dic[key], bpn_dic[key]) +# print("kouyaku:",kouyaku_dic) +m = len(wa_key) +print(m)