Problem:
幾何問題を解こう

A君は今日も幾何の問題を解いている。
幾何の問題を解く時は浮動小数点誤差に気をつけることが大事である。

浮動小数点誤差とは、2進法の有限小数で数を表す際におこる丸めによって起きる誤差である。
例えば、10進法での 0.1 は2進法では 0.00011001100110011 ... という無限小数になるが、
これを有限の桁で丸める際に誤差が発生してしまう。

正の整数 p, q が10進法で与えられる。
有理数 p / q を有限桁数の小数で表現することができるような b 進法（b は2以上の整数）を求めよ。
複数ある場合は最も小さいものを出力せよ。

Constraints

0 < p < q < 10^9

Input Format

入力は以下の形式で標準入力から与えられる。

p q

Output Format

答えを一行に出力せよ。

Sample Input 1

1 2

Sample Output 1

2

1/2 は 2 進法で 0.1 です

Sample Input 2

21 30

Sample Output 2

10

21/30 は 10 進法で 0.7 です

Solution in JAVA (judge verdict: Time Limit Exceeded)

import java.util.Scanner;
import java.util.ArrayList;

public class Main {
	Scanner sc = new Scanner(System.in);
	public void run(){
		int p = sc.nextInt();
		int q = sc.nextInt();
		calc((long)p, (long)q);
	}
	public void calc(long p, long q){
		long a = q;
		long b = p;
		long max = 0;
		while(true){
			long c = a % b;
			if(c == 0){
				max = b;
				break;
			}
			else{
				a = b;
				
				b = c;
			}
		}
		p = p / max;
		q = q / max;
		long ans = -1;
		
		for(int i = 2; i < q+1; i++){
			if(q%i == 0){
				long p1 = p;
				long q1 = q;
				long count = 0;
				while(q1%i == 0){
					count++;
					q1 = q1/i;
				}
				long x = q1;
				
				if(x < i && i%x == 0){
					long y = 1;
					if(x != 1) {
						y = i/x;
						count++;
					}
					p1 = p1*y;
					for(int j = 0; j < count; j++){
						p1 = p1 - (p1%i);
						p1 = p1 / i;
					}
					
					if(p1 == 0){
						ans = i;
					}
				}
			}
			if(ans != -1){
				break;
			}
		}
		System.out.println(ans);
		
	}
	
	public static void main(String[] args){
		new Main().run();
	}
	
}