Language: C++

/* C++14(GCC5.4.1) */
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
static const ll MAX_N = 1000000;
 
 
// m>=nを想定している
ll gcd(ll m, ll n){
    if(n==0) return m;
    return gcd(n, m%n);
}
 
 
// エラトステネスの篩(蟻本p.111)(を改造)
// O(n log log n)なのでほぼ線形時間
// n以下の**nを割り切る**素数の個数を返す
bool is_prime[MAX_N+1];
 
ll sieve(ll n, ll goa){
    ll p=0; // GCDの素因数の個数
    for(ll i=0; i<=n; i++){
        is_prime[i]=true;
    }
    is_prime[0]=false;
    is_prime[1]=false;
    for(ll i=2; i<=n; i++){
        // 素数を見つけたらその倍数はfalse
        if(is_prime[i]){
            if(goa%i == 0) p++; // ここで素因数の条件を課している
            for(ll j=2*i; j<=n; j+=i){
                is_prime[j] = false;
            }
        }
    }
    return p;
}
 
int main(void){
    // 入力
    ll a,b;
    cin >> a >> b;
 
    // a,bのGCDを求める
    // ユークリッドの互除法(蟻本p.108)
    ll gcd_of_ab;
    if(a>=b) gcd_of_ab = gcd(a,b);
    else gcd_of_ab = gcd(b,a);
 
    // 求めたいのはGCD以下のGCDを割り切る素数の個数
    // ただし1が答えに含まれるので注意すること。
    // つまりGCDの素因数の個数+1
    ll rt_gcd = sqrt(gcd_of_ab)+1;
    ll ans = sieve(rt_gcd, gcd_of_ab)+1;
 
    cout << ans;
 
    return 0;
}
/* C++14(GCC5.4.1) */
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
static const ll MAX_N = 1000000;


// m>=nを想定している
ll gcd(ll m, ll n){
    if(n==0) return m;
    return gcd(n, m%n);
}


// エラトステネスの篩(蟻本p.111)(を改造)
// O(n log log n)なのでほぼ線形時間
// n以下の**nを割り切る**素数の個数を返す
bool is_prime[MAX_N+1];

ll sieve(ll n, ll goa){
    ll p=0; // GCDの素因数の個数
    for(ll i=0; i<=n; i++){
        is_prime[i]=true;
    }
    is_prime[0]=false;
    is_prime[1]=false;
    for(ll i=2; i<=n; i++){
        // 素数を見つけたらその倍数はfalse
        if(is_prime[i]){
            if(goa%i == 0) p++; // ここで素因数の条件を課している
            for(ll j=2*i; j<=n; j+=i){
                is_prime[j] = false;
            }
        }
    }
    return p;
}

int main(void){
    // 入力
    ll a,b;
    cin >> a >> b;

    // a,bのGCDを求める
    // ユークリッドの互除法(蟻本p.108)
    ll gcd_of_ab;
    if(a>=b) gcd_of_ab = gcd(a,b);
    else gcd_of_ab = gcd(b,a);

    // 求めたいのはGCD以下のGCDを割り切る素数の個数
    // ただし1が答えに含まれるので注意すること。
    // つまりGCDの素因数の個数+1
    ll rt_gcd = sqrt(gcd_of_ab)+1;
    ll ans = sieve(rt_gcd, gcd_of_ab)+1;

    cout << ans;

    return 0;
}

Compiler output:
a.cc:64:17: error: redefinition of 'const ll MAX_N'
   64 | static const ll MAX_N = 1000000;
      |                 ^~~~~
a.cc:5:17: note: 'const ll MAX_N' previously defined here
    5 | static const ll MAX_N = 1000000;
      |                 ^~~~~
a.cc:68:4: error: redefinition of 'll gcd(ll, ll)'
   68 | ll gcd(ll m, ll n){
      |    ^~~
a.cc:9:4: note: 'll gcd(ll, ll)' previously defined here
    9 | ll gcd(ll m, ll n){
      |    ^~~
a.cc:77:6: error: redefinition of 'bool is_prime [1000001]'
   77 | bool is_prime[MAX_N+1];
      |      ^~~~~~~~
a.cc:18:6: note: 'bool is_prime [1000001]' previously declared here
   18 | bool is_prime[MAX_N+1];
      |      ^~~~~~~~
a.cc:79:4: error: redefinition of 'll sieve(ll, ll)'
   79 | ll sieve(ll n, ll goa){
      |    ^~~~~
a.cc:20:4: note: 'll sieve(ll, ll)' previously defined here
   20 | ll sieve(ll n, ll goa){
      |    ^~~~~
a.cc:98:5: error: redefinition of 'int main()'
   98 | int main(void){
      |     ^~~~
a.cc:39:5: note: 'int main()' previously defined here
   39 | int main(void){
      |     ^~~~