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 Scala (judge verdict: Accepted)


object Main extends App {
  import scala.io.StdIn._
  val Array(p, q) = readLine.trim.split(' ').map(_.toLong)
  val g = gcd(p, q)
  println(
    primeFactors(q / g).foldLeft(1L){case (r, n) ⇒ r * n}
  )
  def primeFactors(num: Long): List[Long] = {
    var n = num
    var res = Nil: List[Long]
    var count = 2
    while (n != 1 && count * count <= num){
      if (n % count == 0){
        res ::= count
        while (n % count == 0){
          n /= count
        }
      }
      count += 1
    }
    if (n == 1) res
    else n::res
  }
  def gcd(a: Long, b: Long): Long = {
    b match {
      case 0 ⇒ a
      case _ ⇒ gcd(b, a % b)
    }
  }
  implicit class ScopeFunc[T](private val value: T) {
    def let[A](func:T ⇒ A): A = func(value)
    def also(func:T ⇒ Unit): T = {
      func(value)
      value
    }
  }
}