結城浩の「マヨイドーロ問題」
※このエントリは競プロで圧倒的成長 Advent Calendar 2015の17日目のエントリです.
※ 出題が終わってしまったため上記のURLから問題が見られません.「マヨイドーロ問題」で検索すると出題pdfが見られます.(pdfへの直リンクは禁止らしいのでここに貼っていません.)
問題概要
- Xから入ってY, Zから出ることのできる「マヨイドーロ」がある
X
\
YーーーーZ - マヨイドーロはZ付近 (A),Y付近 (C),Xから道ZYへの合流地点 (B)で折り返すことができる
- N回まで折り返すことができる時,N回以内の折り返しでYから出るパターンの数Pを求める
解法
- N=nの時のPをPnとする
- 奇数回折り返すと左へ,偶数回折り返すと右へ行く
- Yから出るためには奇数回折り返さなければない
- Pnをいきなり求めるのは難しいので,丁度n回折り返してY or Zから出るパターン数,Qnを考える
- A,Cから折り返してきた時,次はB, CもしくはB, Aで折り返すことができる
- Bから折り返してきた時,次はCもしくはBで折り返すことができる
- 1回目の折り返しはAで折り返してきたと考えることができる
- 従ってn=1の時,Bで折り返す,Cで折り返すの2通りの行動が取れるため,Qn=2
- 続いてn=2の時,Bから折り返してきた時,Cで折り返すの1通り,Cから折り返してきた時,B, Cで折り返すの2通りで,Qn=3
- 同様に求めていくとQ1=2, Q2=3, Q3 = 5, Q4 = 8となり,Qnはフィボナッチ数列のn+2項目であることがわかる
- Pnは丁度k回折り返してYから出るパターン数をk<=Nの場合に足し合わせたものである
- nが偶数の時は丁度n回折り返してYから出ることはできない
- 従ってnが奇数の時のQnを足しあわせたものが答えである
Nの制約条件が書かれていないため何も考えずに,フィボナッチ数列を一般項を使って求めたらオーバーフローした.
多倍長を使って,整数のみで求めて無事正解.
数学的な証明はできなかったので賢い人の解説待ち.