kotazon.com

虎太郎の備忘録

【AtCoder-Ruby】ABC100 B - Ringo's Favorite Numbers

問題文

今日は, 記念すべき AtCoder Beginner Contest 100 が開催される。
そのため, 高橋君はりんごさんに, ある整数をプレゼントしようと思った。
今日のコンテストは「AtCoder Beginner Contest 100」なので, りんごさんは 100 で ちょうど D 回割りきれる正の整数をプレゼントされると喜ぶ.
さて, りんごさんがプレゼントされると喜ぶような整数のうち N 番目に小さいものを求めなさい。

制約

  • D は 0 , 1 , 2 のいずれかである
  • N は 1 以上 100 以下の整数

問題リンク

考えたこと

朝、寝起きにやったこともあり、何言っているかよくわからないので、サンプル2, 3 の結果を見て回答してみた。

D, N = gets.strip.split.map(&:to_i)
puts (10 ** (D + 1)) * N

まあ、ダメだよね。(10 を階乗してるし。多分頭回っていなかった。。)

お昼休みに気を取り直して回答

  • D は、100で割り切れる回数で「 0 , 1 , 2」
  • N は、順番で N番目に小さいもので「1 以上 100 以下の整数」

ああ。。。

  • D = 0 のときは割り切れるものがないので、N が答え
  • D = 1 の時 100 * N
  • D = 2 の時 10000 * N
  • 要は (100 ** D) * N
D, N = gets.strip.split.map(&:to_i)
puts (100 ** D) * N

一部のテストケースで不正解!
なぜだ。。。

回答を確認

したがって、𝑁 ≤100 を仮定すると、𝑁 ≤99 のとき 𝑁𝑎 = 𝑁 ×100𝐷 が答えとなり、
𝑁 = 100 のとき 101𝑎 = 101 × 100𝐷 が答えになります。

解説PDF

なるほど。100 の判定が必要だった。

回答

D, N = gets.strip.split.map(&:to_i)
n = N != 100 ? N : N + 1
puts (100 ** D) * n

考察

この回答だと、200, 300 の時には正解がでない。
方針2, 方針3 での実装が必要。

あとで回答しよう。