ABC115-D:Christmas
Pythonで解いた記念。
問題
レベルバーガーを以下のように定義する。
- のとき,パティ1枚。
- のとき,パン1枚,レベルバーガー,パティ1枚,レベルバーガー,パン1枚 を下から重ねたもの。
レベルバーガーの下から枚目までに,パティは何枚あるか。
考察
レベルバーガーが再帰的に定義されていることを使いたい。絵を描いてみるとこんな感じ。
これの番目が例えばここだとする。
これを見れば,「レベルバーガーの番目までのパティの数」は「レベルバーガーの番目までのパティの数」だとわかるだろう。同様に,レベルバーガーはこんな感じで,番目がここだとする。
これを見れば「レベルバーガーの番目までのパティの数」は
「レベルバーガーの番目までにパティの数レベルバーガーのパティの数」
とわかる。こう考えると,再帰的に問題を解いていけばよさそうという気持ちになれる。
では,具体的に再帰関数を書いていくことを考えよう。まず,レベルのバーガーの長さを,レベルのバーガーにあるパティの数をとすると,これらは次の漸化式を満たす。
これはバーガーの定義からわかるだろう。事前にこれらの値は求めておく。
そして,を次のように定義する。
- のとき,
- のとき,
- のとき,
- のとき, (ちょうど真ん中)
- のとき,
- のとき,
これを実装すればOK。計算量はである。