しずくぶろぐ

競技ぷろぐらみんぐしたり、なんかしたりします

好きな問題がありました #雫ぷよ

解いてみて、これ好き〜ってなる問題があったので書きます。
これ好き〜ってなった問題はAtCoder Beginner Contest 099のC問題,Strange Bankです。
ネタバレされたくない人は先に解いてください。

atcoder.jp

準備はよろしいでしょうか

ででん、これが私の提出です.

integer N,N_6,N_9
integer ans,preans
read*,N

ans=huge(ans)
do i =0,N
  preans=0
  N_6=i
  do while(N_6/=0)
    preans=preans+mod(N_6,6)
    N_6=N_6/6
  end do
  N_9=N-i
  do while(N_9/=0)
    preans=preans+mod(N_9,9)
    N_9=N_9/9
  end do
  ans=min(ans,preans)
end do

print"(I0)",ans
end

この問題のまず好きなところは、
1,6,6^2…だけで払う部分(このコードではi)と1,9,9^2…だけで払う部分(このコードではN-i)
に分けて考えているところですね。

最初1で払う部分,6,6^2で払う部分,9,9^2で払う部分で3つに分けていたんですが、3つではなくて2つに分けられると気づいて美しい……って思いました。
場合分けが少ないと綺麗な感じしますよね


で、まぁそれはさておき、実はこの問題めちゃ好き〜ってなった核心のコアのコアの部分はそこではなくて

  do while(N_6/=0)
    preans=preans+mod(N_6,6)
    N_6=N_6/6
  end do

この部分。

ここの部分は解説のコードみて書いたんですけど、
これ6進法表記でN_6を表したものの各桁の和だな、とは自分でも思ったんです。

これ6進法表記でN_6を表したものの各桁の和だな、6進法に直して各和をとって面倒臭そうだなーって思いながら解説のコード見たんです。

そしたら思ってたのよりはるかに短かくて衝撃を受けました。

でそれからよくよく見たら
6進法表記の下の桁から1つずつ見ては消して見ては消して、行く川の流れは絶えずしてみたいな、ただただ数字を止めることなく動かしているコードだってわかって
はああああ好き。

ただただ答えだけを求める機能美、この問題のためのコード、武産合気、そういうところに感動して気づいたら久しぶりのはてなブログを書いてました。