/*
* 如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。
* 最大公约数 Greatest Common Divisor(GCD)
*
* 12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数;
* 4的倍数有4、8、12、16,……,6的倍数有6、12、18、24,……,4和6的公倍数有12、24,……,其中最小的是12。
*
* 例如:求24和60的最大公约数。先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,
* 它们的积是2×2×3=12,所以,(24,60)=12。
*
* 例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,
* 6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,
* 30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。
*
* 辗转相除法(又称欧几里得算法):用于计算两个非负整数a,b的最大公约数。
* a ÷ b = q ··· r
* 于是,a = b * q + r
* 定理:(a, b) = (b, r) 即(a, b) = (b, a % b)
*
* 进一步求最小公倍数:
* 设(a, b) = k
* 则[a, b] = k * (a / k) * (b / k) = a * b / k
*/
#include <iostream>
using namespace std;
int n, m, a, b;
// 辗转相除法求最大公约数
int gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
int main() {
scanf("%d%d", &n, &m);
if (n > m)
a = gcd(n, m);
else
a = gcd(m, n);
b = n * m / a;
printf("%d %d", a, b);
return 0;
}