const fs = require('fs');
const [a, b] = fs.readFileSync("/dev/stdin").toString().trim()
                 .split(' ').map(Number) ;
const solution = (a, b) => {
  const prime = Object.keys(primeObj(a*b))
  let [pA, pB] = [primeObj(a), primeObj(b)]
  let max = 1
  
  prime.forEach(el => {
    if(pA[el] && pB[el]){
      pA[el] > pB[el] ? 
        max *= el**pB[el] : max *= el**pA[el]
    }
  })
  return max + '\n' + a*b/max
}
const primeObj = num => {
  let i = 2
  let obj = {}
  while(num >= i){
    if(num % i === 0){
      obj[i] = ( obj[i] || 0 ) + 1
      num /= i
    }else{
      i++
    }
  }
  return obj
}
console.log(solution(a, b))
primeObj를 선언한다. primeObj에 넣어 반환된 객체를 pA, pB 라고 한다.max를 만들려면 pA와 pB에 모두 존재하는 요소를 가장 작은 것 제곱수만큼 곱하면 된다.primeObj에 넣어 객체 prime을 만들었다.a*b/max 이다.const fs = require('fs');
const [a, b] = fs.readFileSync("/dev/stdin").toString().trim()
                 .split(' ').map(Number) ;
const solution = (a,b) => {
  const smaller = Math.min(a, b);
  
  for (let i = smaller; i > 0; i--) {
    if (a % i === 0 && b % i === 0) {
      return i +'\n'+ a * b / i
    }
  }
}
console.log(solution(a,b));	
최대공약수 i는 smaller 이하의 자연수 중 a, b에 모두 나누어 떨어지는 최대값이다.
최소공배수는  a * b / i 이다.