考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

ABC100-B - Ringo's Favorite Numbers を解く(2)

ABC100-B - Ringo's Favorite Numbers を解く(1) の続き

 

前回のコードは数ケースで WA が出てしまった

何か考慮漏れがあったのだろうか?

 

前回の回答方針をもう一度確認してみる

 

> D=0 の場合は N の値そのまま

> D=1 の場合は N に 100 を掛けた値

> D=2 の場合は N に 10000 を掛けた値 が答えになると思われる

 

制約はどうだったか?

> Dは 0 , 1 , 2 のいずれか

> N は 1 以上 100 以下の整数

 

…よく考えてみると N が 100 のときは 100 で 1 回割り切れることができるので

D=0 を満たしていない

 

D=1 の場合も同様だ。N=100 の場合は上記回答方針だと 10000 になるが

これは 100 で 2回割り切ることができる数字である

D=2 の場合も同様で N=100 の場合の答えは 1000000 では誤りである

 

どうやら N=100 の場合の出力値が誤っているため WA となったようだ

では正しい値はどうなるか?

 

D=0 の場合、100で0回割り切れる数字は 1 , 2 , 3 , …と続いてきて

100 番目に小さい数であると思われた 100 は、100 で1回割り切れる数であった

ため条件を満たす数ではない

したがってその次の 101 が 100 番目に小さい数である

 

D=1 , D=2 の場合も上記のように同様に数えていくと

D=1 の場合は 100 番目に小さい数は 10100

D=2 の場合は 100 番目に小さい数は 1010000

であるとわかる

 

以上を踏まえて書いたコードを以下に示す

 
提出したコード
# 入力
D,N=map(int,input().split())

# D(=0,1,2)の値によって場合分け
if D==0:
  if N==100:
    print(101)
  else:
    print(N)

elif D==1:
  if N==100:
    print(10100)
  else:
    print(N*100)
else:
  if N==100:
    print(1010000)
  else:
    print(N*10000)

 

N=100 の場合は上記で求めた定数値を出力するようにした

 

提出結果はACでした

 

解説PDFには色んなアプローチによる解説が記載されていました

それによると、今回の自分の回答は「ズルい解法」らしい…

正当な解法を確認したい方は解説PDFの方もご覧ください

 

AtCoder Beginner Contest 100 解説