GCJ 2016 Qualification Round A: Counting Sheep

問題

与えられた非負整数Nについて、N×1,N×2,…とNの倍数をあげていく。その数の10進表記で見た場合の桁が0~9全て出そろった時の最後の数を出力する。(そろわない場合は"INSOMNIA"を出力)

例:N=2の場合、2×1=2,2×2=4,…,2×35=70,…,2×44=88,2×45=90 で0~9が全て出そろうので、結果は 90 となる。

https://code.google.com/codejam/contest/6254486/dashboard

方針

特に最適な解法というのが思いつかなかったので、単純にNの倍数を上げていきチェックする方法をとった。

なお、INSOMNIA になる条件は N=0 の場合とした。

実装

require 'set'

def solve(n)
    return 0 if n == 0

    digits = Set.new
    i = n
    while(true)
        i.to_s(10).chars { |c| digits.add(c) }
        return i if digits.size == 10
        i += n
    end
end

STDIN.gets

i = 1
STDIN.each_line {|line|
    ret = solve(line.to_i)
    if ret == 0 then
        printf "Case #%d: INSOMNIA\n", i
    else
        printf "Case #%d: %d\n", i, ret
    end
    i += 1
}