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 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MAX(X, Y) (((X) > (Y))? (X) : (Y))
#define MIN(X, Y) (((X) < (Y))? (X) : (Y))
int compare_int(const void *a, const void *b){
  return *(long int*)b - *(long int*)a; // 大きい順
}
int compare_int_small(const void *a, const void *b){
  return *(long int*)a - *(long int*)b; // 小さい順
}
// 公約数
long int gcd(long int a, long int b){
  if(b == 0){
    return a;
  }else{
    return gcd(b, a % b);
  }
}
// 最小公倍数 = a * b / 最大公約数
// 公倍数
long int lcm(long int a, long int b){
  return a * b / gcd(a, b);
}



// min
int main(void){

  long int a, b;
  long int y[100001] = {0};
  long int cnt = 0;
  long int yakusu;
  long int ans = 0;;

  scanf("%ld%ld", &a, &b);

  // 最大公約数を求める
  yakusu = gcd(a, b);

  if(yakusu == 1){
    printf("1\n");
    return 0;
  }

  /*
  y[0] = yakusu;
  cnt++;
  */
  /*
  // 最大公約数より小さい数たちが公約数
  for(long int i = yakusu - 1; i > 0; i--){
    if(yakusu % i == 0){
      y[cnt] = i;
      cnt++;
    }
  }
  */
  /*
  // 約数となる値を詰めてみた
  // 配列への詰め方を変更
  for(long int i = 1; i*i <=  yakusu; i++){
    if(yakusu % i == 0){
      y[cnt] = i;
      cnt++;
      //      if(i != 1){
	y[cnt] = yakusu / i;
	cnt++;
	//      }
    }
  }
  */
  //  qsort(y, cnt, sizeof(long int), compare_int);

  /*
  for(int i= 0; i < cnt; i++){
    //    printf("%ld\n", y[i]);
  }
  */

  /*
  // お互いに素の組合せを数える
  for(long int i = 0; i < cnt; i++){
    for(long int j = i + 1; j < cnt; j++){
      //      printf("y[%ld] = %ld, y[%ld] = %ld\n", i, y[i], j,y[j]);
      if(y[i] % y[j] == 0 && y[j] != 1){
	break;
      }else{
	//	printf("++\n");
	if(j == cnt - 1){
	  ans++;
	  //	  printf("OK++\n");
	}
      }
    }
  }
  */

  // 素因数分解して、その時に出てきた数が何かを求める
  // 1 は必ず割り切れるので、2から計算始める
  // i * i なのは　n が100の時、約数は10 * 10を境に、、、
  long int n = yakusu;
  for(long int i = 2; i * i <= n; i++){
    if(n % i == 0){
      y[i]++;
      ans++;
      while(n % i == 0){
	n /= i;
      }
    }
  }
  // 割り切れなかった数も素数
  if(n != 1){
    y[n]++;
    ans++;
  }
  

  // あ、そっか。答えにはy[]で求めた値は本当に何も使わないのか、、
  
  // 1の分
  ans++;
  printf("%ld\n", ans);
  return 0;
}