問題概略
以下のような法則で左から順にカードに数を記入して並べていくゲームをしています。
- 1 番目のカードには 1 を記入する。
- 偶数番目のカードには番号が半分のカードと同じ数を記入する。たとえば 10 番目のカードには 5 番目のカードと同じ数を記入する。
- 奇数番目のカードにはその番号を 2 で割って を引いたカード番号の数に 1 を加えて記入する。たとえば 11 番目のカードには 番目のカードに記入されている数に 1 を足した数を記入する。
このゲームをカード番号が 300 番になるまで続けたとき,カードに記入された数の最大値を求めてください。
解説の pdf も作りました。きれいなレイアウトで読みたい方はこちらをどうぞ。
漸化式を使って計算
まずは問題文の条件をそのまま漸化式にしてみました。
が奇数のときは引数を に変えるので,次のようになります。
この漸化式を使って から まで計算したときの最大値が答えです。
mathematica で計算しました。答えは 8 です。
In[]:= AbsoluteTiming[ f[1] = 1; f[n_] := f[n] = If[EvenQ@n, f[n/2], f[(n - 1)/2] + 1]; ans = Max[f /@ Range@300]] Out[]= {0.0009785, 8}
2 進法で考える
2 進法で考えると , は末尾を削る操作です。
1 を削るたびに が 1 増えるので,最大値を与える は 2 進法であらわしたときにすべての桁が 1 になる数です。
以下だと ですね。こう考えると最大値の 8 は暗算で求められます。
同じ発想で一般の を求めることもできます。
を求める過程は の 2 進法表記を右から見ていって 1 を数えるのと同じです。
これは mathematica だと で求められます。
漸化式を使うよりこっちの方が速いです。
In[]:= AbsoluteTiming[ f[n_] := DigitCount[n, 2, 1]; ans = Max[f /@ Range@300]] Out[]= {0.0002094, 8}