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

#define NDEBUG

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <assert.h>
// for DEBUG {{{
#ifdef NDEBUG
#define DEBUG_PRINT(fmt, ...) ((void)0)
#else
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
#endif
#define ASSERT_RANGE(min,x,max) assert(((x)>=(min)) && ((x)<=(max)))
// }}}

typedef long long ll;

#define GET_D(x) fscanf(stdin,"%d",&(x)) > 0
#define GET_LLD(x) fscanf(stdin,"%lld",&(x)) > 0
#define GET_S(x) fscanf(stdin,"%s",(x)) > 0

#define PUT_D(x) fprintf(stdout,"%d\n",(x))
#define PUT_Ds(x) fprintf(stdout,"%d ",(x))
#define PUT_LLD(x) fprintf(stdout,"%lld\n",(x))
#define PUT_LLDs(x) fprintf(stdout,"%lld ",(x))
#define PUT_LN fprintf(stdout,"\n")

#define FOR(i,min,max) for ((i) = (min); (i) < (max); (i)++)

void merge_int(int *val, int lower, int sep, int upper, int *tmp_val) {// {{{
	int i_lower = lower;
	int i_upper = sep;
	int i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b++] = val[i_lower++];
		} else {
			tmp_val[i_b++] = val[i_upper++];
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b++] = val[i_upper++];
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b++] = val[i_lower++];
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
	}
}// }}}
void merge_sort_int(int *val, int lower, int upper, int *tmp_val) {// {{{
	int sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_int(val,lower,sep,tmp_val);
	merge_sort_int(val,sep,upper,tmp_val);
	merge_int(val,lower,sep,upper,tmp_val);
	return;
}// }}}

void merge_int_int(int *val, int *index, int lower, int sep, int upper, int *tmp_val, int *tmp_index) {// {{{
	int i_lower = lower;
	int i_upper = sep;
	int i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		} else {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
		index[i_lower+lower] = tmp_index[i_lower];
	}
}// }}}
void merge_sort_int_int(int *val, int *index, int lower, int upper, int *tmp_val, int *tmp_index) {// {{{
	int sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_int_int(val,index,lower,sep,tmp_val,tmp_index);
	merge_sort_int_int(val,index,sep,upper,tmp_val,tmp_index);
	merge_int_int(val,index,lower,sep,upper,tmp_val,tmp_index);
	return;
}// }}}

void merge_ll(ll *val, ll lower, ll sep, ll upper, ll *tmp_val) {// {{{
	ll i_lower = lower;
	ll i_upper = sep;
	ll i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b++] = val[i_lower++];
		} else {
			tmp_val[i_b++] = val[i_upper++];
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b++] = val[i_upper++];
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b++] = val[i_lower++];
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
	}
}// }}}
void merge_sort_ll(ll *val, ll lower, ll upper, ll *tmp_val) {// {{{
	ll sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_ll(val,lower,sep,tmp_val);
	merge_sort_ll(val,sep,upper,tmp_val);
	merge_ll(val,lower,sep,upper,tmp_val);
	return;
}// }}}

void merge_ll_ll(ll *val, ll *index, ll lower, ll sep, ll upper, ll *tmp_val, ll *tmp_index) {// {{{
	ll i_lower = lower;
	ll i_upper = sep;
	ll i_b = 0;
	while ((i_lower < sep) && (i_upper < upper)) {
		if (val[i_lower] < val[i_upper]) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		} else {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	}
	if (i_lower >= sep) {
		while (i_upper < upper) {
			tmp_val[i_b] = val[i_upper];
			tmp_index[i_b] = index[i_upper];
			i_b++;
			i_upper++;
		}
	} else {
		while (i_lower < sep) {
			tmp_val[i_b] = val[i_lower];
			tmp_index[i_b] = index[i_lower];
			i_b++;
			i_lower++;
		}
	}
	for (i_lower = 0; i_lower < i_b; i_lower++) {
		val[i_lower+lower] = tmp_val[i_lower];
		index[i_lower+lower] = tmp_index[i_lower];
	}
}// }}}
void merge_sort_ll_ll(ll *val, ll *index, ll lower, ll upper, ll *tmp_val, ll *tmp_index) {// {{{
	ll sep;
	if ((lower == upper) || (lower + 1 == upper)) {
		return;
	}
	sep = (lower + upper) / 2;
	merge_sort_ll_ll(val,index,lower,sep,tmp_val,tmp_index);
	merge_sort_ll_ll(val,index,sep,upper,tmp_val,tmp_index);
	merge_ll_ll(val,index,lower,sep,upper,tmp_val,tmp_index);
	return;
}// }}}


#define N_MIN 1
#define N_MAX 1000000000000

int get_first_diviser(ll target, ll search_from) {
	ll i;
	ll i_max = sqrt(target)+1;
	FOR(i,search_from,i_max) {
		if ((target % i) == 0) {
			return i;
		}
	}
	return target;
}

ll get_diviser(ll target, ll ref) {
	ll count = 1;
	ll cur = 2;
	if (target == 1) {
		return count;
	}
	DEBUG_PRINT("1 1\n");
	while (1) {
		cur = get_first_diviser(target,cur);
		if ((ref % cur) == 0) {
			count++;
			DEBUG_PRINT("1 ");
		} else {
			DEBUG_PRINT("0 ");
		}
		DEBUG_PRINT("%lld ",cur);
		if (cur == target) {
			return count;
		}
		while ((target % cur) == 0) {
			target /= cur;
		}
		DEBUG_PRINT("%lld\n",target);
		if (target == 1) {
			return count;
		}
	}
	return 0;
}

int main(int argc, char **argv) {
	ll a,b;

	GET_LLD(a);
	GET_LLD(b);

	if (a<b) {
		PUT_LLD(get_diviser(a,b));
	} else {
		PUT_LLD(get_diviser(b,a));
	}
	return 0;
}