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: Time Limit Exceeded)


#include <iostream>
#include <string>
#include <algorithm>
#include <set>
#include <cmath>
#include <vector>

typedef long long ll;
const ll LL_MAX (1LL<<60);

#define rep(i,s,e) for(ll i=(s); i<(e); i++) 

using namespace std;

bool operator<(set<ll>&a, set<ll>&b)
{
    if (a < b)
        return true;

    return false;
}

set<ll> divider(ll&n)
{
    set<ll> ans;
    rep(i,1,n/2+1)
    {
        if (n % i == 0)
        {
            ans.insert(i);
            if (i != n)
                ans.insert(i);
        }
    }

    //for (auto i: ans)
    //    cout << i << endl;
    return ans; 
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    ll a, b;
    cin >> a >> b;

    set<ll> mod_a(divider(a));
    set<ll> mod_b(divider(b));

    set<ll> result;

    set_intersection(mod_a.begin(), mod_a.end(), mod_b.begin(), mod_b.end(), inserter(result, result.end()));

    ll c(0);
    for (auto i: result)
    {
        set<ll> tmp(divider(i));
        if (tmp.size() == 1)
            c++;
    }

    cout << c+1 << endl;

    //for (auto i: result)
    //    cout << i << ' ';
    //cout << endl;

    return 0;
}