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: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;

// bool prime[100000];

// void sieve(){
//     memset(prime,true,sizeof(prime));
//     for(int i = 2; i*i<100000; ++i){
//         if(prime[i]){
//             for(int j = 2*i; j < 100000; j += i){
//                 prime[j] = false;
//             }
//         }
//     }
// }
bool prime[1000003];
bool sieve() {
    memset(prime, true, sizeof(prime));
    for(int i = 2; i * i < 1000003; ++i){
        if(prime[i]){
            for(int j = 2 * i; j < 1000003; j += i){
                prime[j] = false;
            }
        }
    }
}

// int facsum(int num){
//     int sum = 0;
//     for(int i = 1; i < num; ++i){
//         if(num%i == 0)
//             sum += i;
//     }
//     return sum;
// }
// int dp[100000];
// string add(string s1, string s2){
//     reverse(s1.begin(), s1.end());
//     reverse(s2.begin(), s2.end());
//     string sum;
//     int carry = 0;
//     for(int i = 0; i < min(s1.length(), s2.length()); ++i){
//         int x1 = s1[i]-'0';
//         int x2 = s2[i]-'0';
//         int sumx = x1+x2+carry;
//         if(sumx >= 10){
//             sum.push_back('0'+(sumx%10));
//             carry = sumx/10;
//         }
//         else {
//             sum.push_back('0'+sumx);
//             carry = 0;
//         }
//     }
//     if(s1.length() < s2.length()){
//         for(int i = s1.length(); i < s2.length(); ++i){
//             int sumx = s2[i]-'0'+carry;
//             if(sumx >= 10){
//                 sum.push_back('0'+(sumx%10));
//                 carry = sumx/10;
//             }
//             else{
//                  sum.push_back('0'+sumx);
//                  carry = 0;
//             }
            
//         }
//     }
//     else if(s1.length() > s2.length()){
//         for(int i = s2.length(); i < s1.length(); ++i){
//             int sumx = s1[i]-'0'+carry;
//             if(sumx >= 10){
//                 sum.push_back('0'+(sumx%10));
//                 carry = sumx/10;
//             }
//             else{
//                  sum.push_back('0'+sumx);
//                  carry = 0;
//             }
            
//         }
//     }
//     else if(carry)sum.push_back('0'+carry);
    
//     reverse(sum.begin(), sum.end());
//     return sum;
// }
// int dsum(int x){

// }
int main(){
    // sieve();
    // memset(dp,-1,sizeof(dp));
    // set<int>ami;
    // for(int i = 2; i < 10000; ++i){
    //     if(ami.find(i) != ami.end() || prime[i])
    //         continue;
    //     int sum1 = 0, sum2 = 0;
    //     sum1 = facsum(i);
    //     if(prime[sum1] || sum1 == 1 || sum1<=i)
    //             continue;
    //     sum2 = facsum(sum1);
    //     if(sum2 == i){
    //         ami.insert(i);
    //         if(ami.find(sum1) == ami.end()){
    //             ami.insert(sum1);
    //         }
    //     }
    // }
    // long long ans = 0;
    // for(int x: ami){
    //     cout << x << " ";
    // }
    // cout << ans;
    //     int sum = 0;
    //     for(int i = 1; i < 10000; ++i){
    //         if(10000%i == 0)
    //             sum += i;
    //     }
     
    // cout << sum;
    // ifstream in;
    // in.open("s.txt");
    // string line;
    // getline(in, line);
    // in.close();   
    // string s[5163];
    // int c = 0, start = 1, end;
    // for(int i = 1; i < line.length(); ++i){
    //     if(line[i] == '"'){
    //         s[c] = line.substr(start, i-start);
    //         start = i + 3;
    //         c++;
    //         i += 2;
        
    //     } 
    // }
    // // cout << c;
    // sort(s, s+5163);
    // int ans = 0;
    // map<char,int>mp;
    // for(int i = 0; i < 26; ++i){
    //     mp['A'+i] = i + 1; 
    // }
    // for(int i = 0; i < 5163; ++i){
    //     int sum = 0;
    //     for(int j = 0; j < s[i].length(); ++j){
    //         sum += mp[s[i][j]];
    //     }
    //     ans += (i+1)*sum;
    // }
    // cout << ans;
    // vector <int> s;
    // int count = 0;
    // for(int i = 12; i <= 28123; ++i){
    //     if(facsum(i) > i){
    //         count ++;
    //         s.push_back(i);
    //     }
    // }
    // bool abundant[56247];
    // memset(abundant, false, sizeof(abundant));
    // for(int i = 0; i < s.size(); ++i){
    //     for(int j = i; j < s.size(); ++j){
    //         abundant[s[i]+s[j]]=true;
    //     }
    // }
    // int sum = 0;
    // for(int i = 1; i < 28124; ++i){
    //     if(abundant[i] == false)
    //         sum += i;
    // }

    // cout << sum;
    // string s = "0123456789";
    // int count = 1;
    // do{
    //     if(count == 1000000)
    //         cout << s << " ";
    //     count ++;
    // }while(next_permutation(s.begin(),s.end()) && count < 1000001);
    // cout << add("220","100000");
    // string dp[2];
    // dp[0]="1",dp[1]="1";
    // int count = 2; 
    // while(1){
    //     string ans = add(dp[0], dp[1]);
    //     dp[0]=dp[1];
    //     dp[1]=ans;
    //     // cout << ans<< ' ';
    //     if(ans.length()>=1000){
    //         cout<<count+1;
    //         break;
    //     }
    //     if(count == 11)
    //         cout << ans.length();
    //     count ++;
    // }
    // int maxx = 0,res;
    // for(int i = 2; i < 1000; ++i)
    // {   int ans,den=i,num=1;
    //     int a[1000]={0};
    //     int ind = 0;
    //     while(num % den != 0){
    //         while(num < den)
    //             num *= 10;
    //         if(num%den == 0){
    //             ans = 0;
    //             break;
    //         }
    //         if(a[num%den]){
    //             ans = ind - a[num%den] + 1;
    //             break;
    //         }
    //         a[num%den] = ind;
    //         num = num % den;
    //         ind ++;
    //     }
    //     if(ans > maxx)
    //         res = i;
    //     maxx=max(maxx,ans);
    // }
    // cout << res;
    // sieve();
    // int nmax=0,maxa,maxb;
    // for(int a=-1000;a<1000;++a){
    //     for(int b=-1000;b<1000;++b){
    //         int n=0;
    //         while(prime[abs(n*n+n*a+b)]){
    //             n++;
    //         }
    //         if(n>nmax){
    //             maxa=a;
    //             maxb=b;
    //             nmax=n;
    //         }••••••••••
    //     }
    // }
    // cout<<maxa*maxb;
    // int sum1=1,sum2=0;
    // int a=1;
    // for(int i=0;i<1000;++i){
    //     a+=2*(i+1);
    //     sum1+=a;
    //     cout<<a<<" ";
    // }
    // a=1;
    // for(int i=1;i<=500;i++){
    //     a+=4*i;
    //     sum2+=a;
    //     cout<<a<<" ";
    //     a+=4*i;
    //     sum2+=a;
    //     cout<<a<<" ";
    // }
    // cout<<endl<<sum1+sum2;
    // int t;
    // cin >> t;
    // while(t--) {
    //     long long x, y;
    //     cin >> x >> y;
    //     if(x - y == 1)
    //         cout << "NO" << endl;
    //     else cout << "YES" << endl;
    // }
    sieve();
    int a, b;
    cin >> a >> b;
    int count = 0;
    int n = __gcd(a, b);
    int g = n;
    for(int i = 2; i*i < 1000003; ++i){
        if(g%i==0) {
            count ++;
            while(g%i==0)g/=i;
        }
    }
    if(g>1)
    count++;
    // for(int i=2;i<10;i++){
    //     if(prime[i])
    //     cout<<i<<" ";
    // }
    cout << count+1 << endl;
}