Problem:
GCD and LCM

Write a program which computes the greatest common divisor (GCD) and the least common multiple (LCM) of given a and b.

Input

Input consists of several data sets. Each data set contains a and b separated by a single space in a line. The input terminates with EOF.

Constraints

0 < a, b ≤ 2,000,000,000

LCM(a, b) ≤ 2,000,000,000

The number of data sets ≤ 50

Output

For each data set, print GCD and LCM separated by a single space in a line.

Sample Input

8 6
50000000 30000000

Output for the Sample Input

2 24
10000000 150000000

Solution in JAVA (judge verdict: Accepted)


import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Main p = new Main();
	}

	public Main() {
		Scanner sc = new Scanner(System.in);
		String str = "";
	
		while(sc.hasNextLine()){
			str = sc.nextLine();
			String[] numStrs = str.split(" ");
			int a = Integer.parseInt(numStrs[0]);
			int b = Integer.parseInt(numStrs[1]);
			if(b>a){
				int w = a;
				a = b;
				b = w;
			}
			solve(a, b);
		}
	}

	public void solve(int a, int b) {
		int gcdRes = gcd(a, b);
		int lcmRes = lcm(a, b, gcdRes);
		
		System.out.println(gcdRes + " " + lcmRes);
	}
	
	private int gcd(int a, int b){
		if(a%b == 0)
			return b;
		
		return gcd(b, a%b);
	}
	
	private int lcm(int a, int b, int gcdNum){
		return (int)(((long)a*b) / gcdNum);
	}
	
	/** バグがある? **/
	private int lcm(int a, int b){
		if(a<=3){
			if(a==b)
				return a;
			else
				return a*b;
		}else if(a%b==0){
			return a;
		}

		int r = b;
		for(int i=2;i*i<=a;i++){
			int aFact = 1;
			while(a%i==0){
				a = a/i;
				aFact*=i;
			}
			
			int bFact = 1;
			while(b%i==0){
				b = b/i;
				bFact*=i;
			}
			
			if(aFact>bFact)
				r *= (aFact/bFact);
		}
		return r*a;
		
	}
	

}