ABC296 D問題 M<=ab

atcoder.jp

条件1  1 \le a \le N, 1 \le b \le N
条件2  ab \ge M

条件1,2を満たす最小の abを求める問題です。
 a を決めると、条件2から  b \ge \mathrm{ceil}(M/a) となります。(ceilは小数点以下を切り上げる関数)
 abの最小値を問われているので、 b の最小値だけを考えて  ab= a \times \mathrm{ceil}(M/a) を調べればよいです。
また、 a,bは入れ替えても条件は変わらないため、 a \le bの範囲で調べれば十分です。
 a を 1から N まで変えて、 b = \mathrm{ceil}(M/a) a以上 N 以下であれば  ab= a  \times \mathrm{ceil}(M/a) をこれまでの最小値と比較して、小さければ最小値を更新します。

コード例 (Julia)

function solve()

  # 入力
  readInts() =  parse.(Int,split(readline()))
  readInt()  =  parse(Int,readline())

  N,M = readInts()

  ans = -1
  for i = 1:N
    if i * i > M
      break
    end

    k = cld(M,i)

    if k > N || k < i
      continue
    end

    p = k * i

    if ans == -1 || p <= ans
      ans = p
    end
  end

  println(ans)

end  # function solve

# main
solve()