Problem:
Score : 400 points

Problem Statement

Given are positive integers A and B.

Let us choose some number of positive common divisors of A and B.

Here, any two of the chosen divisors must be coprime.

At most, how many divisors can we choose?

Definition of common divisor

An integer d is said to be a common divisor of integers x and y when d divides both x and y.

Definition of being coprime

Integers x and y are said to be coprime when x and y have no positive common divisors other than 1.

Definition of dividing

An integer x is said to divide another integer y when there exists an integer \alpha such that y = \alpha x.

Constraints

All values in input are integers.

1 \leq A, B \leq 10^{12}

Input

Input is given from Standard Input in the following format:

A B

Output

Print the maximum number of divisors that can be chosen to satisfy the condition.

Sample Input 1

12 18

Sample Output 1

3

12 and 18 have the following positive common divisors: 1, 2, 3, and 6.

1 and 2 are coprime, 2 and 3 are coprime, and 3 and 1 are coprime, so we can choose 1, 2, and 3, which achieve the maximum result.

Sample Input 2

420 660

Sample Output 2

4

Sample Input 3

1 2019

Sample Output 3

1

1 and 2019 have no positive common divisors other than 1.

Solution in C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define ll long long
#define rep(i,n) for(ll i=0;i<(n);i++)
#define max(p,q) ((p)>(q)?(p):(q))
#define min(p,q) ((p)<(q)?(p):(q))
#define chmax(a,b) ((a)=(a)>(b)?(a):(b))
#define chmin(a,b) ((a)=(a)<(b)?(a):(b))
#define abs(p) ((p)>=(0)?(p):(-(p)))
#define MOD 1000000007
ll powll(ll a,ll b){ll r=1;rep(i,b){r*=a;}return r;}
#define swap(a,b) do{ll w=(a);(a)=(b);(b)=w;}while(0)
#define swapd(a,b) do{double w=(a);(a)=(b);(b)=w}while(0)

//your code here!
ll boolPRI(ll x){
    if(x==2) return 1;
    if(x%2==0) return 0;
    for(ll i=3; i<=sqrt(x); i+=2){
        if(x%i==0) return 0;
    }
    return 1;
}
/*int main(void){
    ll A, B, ans=1;
    scanf("%lld %lld", &A, &B);
    if(min(A,B)!=1 && boolPRI(min(A,B))){
        if(max(A,B)%min(A,B) ==0 ) puts("2");
        else puts("1");
        return 0;
    }
    double end = sqrt(A)+1;
    for(ll i=2; i<=end; i++){
        if(A%i==0 && B%i==0 && boolPRI(i)) ans++;
    }
    printf("%lld\n", ans);
    return 0;
}*/

ll gcd(ll A, ll B){
    ll w, gcd=A, b=B;
    if(gcd<b) swap(gcd, b);
    while(b){
        w=gcd%b;
        gcd=b;
        b=w;
    }
    return gcd;
}

int main(void){
    ll A, B, ans=1;
    scanf("%lld %lld", &A, &B);
    ll g = gcd(A, B);
    for(ll i=2; i<=g; i++){
        if(A%i==0 && B%i==0 && boolPRI(i)){
            ans++;
            g /= i;
        }
    }
    printf("%lld\n", ans);
}