Problem:
D: 貪欲が最適？

物語

1, 5, 10, 50, 100, 500 円玉がある日本では、ある金額を支払う時、大きい金額の硬貨をできるだけ多く使うという方法で支払うと、硬貨の枚数を最小化できることが知られている。

硬貨の金額が日本とは異なる場合、貪欲に支払うと必ずしも最小化できるとは限らない。

貪欲に支払うのが最適になるために、硬貨の金額が満たすべき条件は何なのだろうか。

問題

TAB 君は上のことが気になったので、まずは硬貨が 1, A, B の 3 種類しかない場合について考えることにした。

A, B が与えられるので、貪欲に支払った場合枚数が最小にならないような金額のうち、最小のものを出力せよ。

また、どんな金額でも貪欲法が最適な場合は、-1 を出力せよ。

入力形式

A B

制約

1 < A \leq 10^5

A < B \leq 10^9

入力例 1

4 6

出力例 1

8

8 円を貪欲に支払うと、 6 + 1 \times 2 で支払うことになり、合計 3 枚必要だが、4 \times 2 で合計 2 枚で支払うことができる。

入力例 2

2 1000000000

出力例 2

-1

どんな金額であっても貪欲に支払うのが最適である。

Solution in Scala (judge verdict: Accepted)

import scala.annotation.tailrec
import scala.io.StdIn._
object Main extends App {

  val Array(a, b) = readLine.trim.split(' ').map(_.toInt)
  if (b % a != 0) {
    val g = gcd(a, b)
    val small = a / g
    val large = b / g
    val inv = (1L to small).find(_ * large % small == 1).map(i ⇒ (large - (large * i / small) % large)).get
    println((1L to small).map { i ⇒ inv * i % large * small * g }.filter{sum ⇒ sum / a < sum % b / a + sum % b % a + sum / b}.minOption.getOrElse(-1))
  }else {
    println(-1)
  }
  @tailrec def gcd(a: Long, b: Long): Long = {
    b match {
      case 0 ⇒ a
      case _ ⇒ gcd(b, a % b)
    }
  }
  implicit class Scope[T](val value: T) extends AnyVal {
    def let[A](@inline func: T ⇒ A): A = func(value)
    def also(@inline func: T ⇒ Unit): T = {func(value);value}
    def minOption[A](implicit ev: T ⇒ Iterable[A], ord: Ordering[A]): Option[A] = if (value.isEmpty) None else Some(value.min)
  }
}