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++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <list>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define rep2(i, s, n) for(int i=s; i<(n); ++i)
#define sz(x) int(x.size())

typedef long long ll;

using namespace std;

/*******-c++14 don't include-*******/
template<typename T>
T gcd(T a, T b){if( b == 0)return a; return gcd(b, a%b); }
template<typename T>
T lcm(T a, T b){return a*b/gcd(a,b); }
/*******---------------------*******/

static const int INTINF = (2147483647);
static const ll LLINF = (1ll<<32);
static const int MAX = 100001;

bool isPrime(ll x){
    if (x < 2)return false;
    else if(x == 2)return true;
    if(x % 2 == 0)return false;
    for(int i = 3; i*i <=x; i+=2){
        if(x % i==0)return false;
    }
    return true;
}

int main(int argc, const char * argv[]) {
    // input from txt
    
    /////////
    //write//
    /////////
    
    ll a, b;
    cin >> a >> b;
    ll gcd1 = gcd(a, b);
    ll agcd = a/gcd1;
    ll bgcd = b/gcd1;
    int gcd3 = (int)min(a, bgcd);
    int gcd4 = (int)min(agcd, b);
    int gcd2 = max(gcd3, gcd4);
    int *dp = new int[gcd2+1];
    fill(dp, dp+gcd2+1, 1);
    
    rep2(i, 2, gcd2+1){
        if(dp[i]){
            int j = i + i;
            while(j <= gcd2){
                dp[j] = 0;
                j = j+i;
            }
        }
    }
    
    int cnt = 0;
    rep2(i, 1, gcd2+1){
        if(dp[i]){
            if(a%i!=0 || b%i!=0)dp[i] = 0;
            else cnt++;
        }
    }
    
    cout << cnt << endl;
    
    
    return 0;
}