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 9.2.1) (judge verdict: Wrong Answer)

#ifdef _MSC_VER
#include <__msvc_all_public_headers.hpp>
#undef min
#undef max
#else
#define NDEBUG
#include <bits/stdc++.h>
#endif

using namespace std;
using large = long long;

int main() {
    large a, b;
    cin >> a >> b;

    const auto factors = []() {
        auto f = vector<int>();
        f.reserve(1'000'000);
        f.push_back(2);
        f.push_back(3);
        f.push_back(5);
        f.push_back(7);

        const auto is_prime = [](auto x) {
            assert(x >= 11);
            if (x % 2 == 0 || x % 3 == 0)
                return false;
            for (auto d = 5; d * d <= x; d += 6) {
                if (x % d == 0)
                    return false;
                if (x % (d + 2) == 0)
                    return false;
            }
            return true;
        };

        for (auto d = 11; d <= 1'000'000; d += 6) {
            if (is_prime(d))
                f.push_back(d);
            if (d + 2 <= 1'000'000 && is_prime(d + 2))
                f.push_back(d + 2);
        }

        return f;
    }();
    auto fcount = 1LL; // divisor of 1

    for (const auto d : factors) {
        if (!(d <= a && d <= b))
            break;

        auto acnt = 0;
        auto bcnt = 0;
        while (a % d == 0) {
            a /= d;
            acnt++;
        }
        while (b % d == 0) {
            b /= d;
            bcnt++;
        }
        if (acnt && bcnt)
            fcount++;
    }

    cout << fcount << endl;
    return 0;
}