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: Runtime Error)

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <assert.h>
typedef int64_t ll;
typedef uint64_t ull;
int acs(const void *a, const void *b){return *(int*)a - *(int*)b;} /* 1,2,3,4.. */
int des(const void *a, const void *b){return *(int*)b - *(int*)a;} /* 8,7,6,5.. */
#define min(a,b) (a < b ? a: b)
#define max(a,b) (a > b ? a: b)

#define MAXN (200001)
#define MOD (1000000007)

ll gcd(ll a, ll b){
	if(b == 0) return a;
	else return gcd(b, a % b);
}

//素数判定
#define ER_MAX (1000000)
int er[ER_MAX+1];
void calcPrime(void)
{
    int i;
    er[0] = false;
    er[1] = false;
    for(i=2;i<=ER_MAX;i++) er[i] = 2;

    i = 2;
    while(i<=ER_MAX)
    {
        if(er[i]==2)
        {
            er[i] = 1;
            int j = i*2;
            while(j<=ER_MAX)
            {
                er[j] = 0;
                j += i;
            }
        }
        i++;
    }
}



int main(void)
{
    ll a,b;
    scanf("%ld %ld",&a,&b);

    ll g = gcd(a,b);
    calcPrime();

    if(g==1)
    {
        printf("1\n");
        return 0;
    }

    ll ans=1;
    for(int i=2;i*i<=g;i++)
    {
        if(!er[i]) continue;
        if(g%i==0)
        {
            ans++;
            if(er[g/i]&&g!=g/i) ans++;
        }
    }
    if(ans==1) ans=2;

    printf("%ld\n", ans);
    return 0;
}