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 Java (OpenJDK 11.0.6) (judge verdict: Accepted)



import java.util.Scanner;

public class Main {

     static Scanner scanner;

     public static void main(String[] args) {
         scanner = new Scanner(System.in);

         long A=gl();
         long B=gl();

         long c=0;
         if (A<B) {
        	 for (long i=1; i<=Math.sqrt(A); i++) {
        		 if(A%i==0) {
        			 long i2=A/i;
        			 if(B%i==0) {
                         if(isP(i) || i==1) c++;
        			 }

        			 if(B%i2==0 && i2!=i) {
                         if(isP(i2) || i2==1) c++;
        			 }
        		 }
        	 }
         } else {
        	 for (long i=1; i<=Math.sqrt(B); i++) {
        		 if(B%i==0) {
        			 long i2=B/i;
        			 if(A%i==0) {
                         if(isP(i) || i==1) c++;
        			 }

        			 if(A%i2==0 && i2!=i) {
                         if(isP(i2) || i2==1) c++;
        			 }
        		 }
        	 }
         }

         System.out.println(c);
     }

  // 素数判定
 	public static boolean isP(long n) {
 		if(n==1) return false;
 		for (int i=2; i<=Math.sqrt(n);i++) {
 			if(n%i==0) {
 				return false;
 			}
 		}

 		return true;
 	}

     // 文字列として入力を取得
     public static String gs() {
          return scanner.next();
     }

     // intとして入力を取得
     public static int gi() {
          return Integer.parseInt(scanner.next());
     }

     // longとして入力を取得
     public static long gl() {
          return Long.parseLong(scanner.next());
     }

     // doubleとして入力を取得
     public static double gd() {
          return Double.parseDouble(scanner.next());
     }
}