Image Description
hotman78
  • 2021-01-13

難しい和音【Mojacoder】 解説

問題

難しい和音 | MojaCoder
難しい和音 | MojaCoder favicon https://mojacoder.app/users/riantkb/problems/toj_ex_1/
難しい和音 | MojaCoder

初項が AA , BB のフィボナッチ数列の部分和として正整数 MM を表す時、部分和の要素数の最大値を求める問題

考察

  • ぱっと見ゼッケンドルフの定理が使えそう

  • 後ろから貪欲に取るもののサンプルが合わない

  • i=0nFi=Fn+21\sum_{i=0}^n F_i=F_{n+2}-1 という等式を発見

  • 後ろから枝刈り全探索が通りそう

  • AC

何故うまくいくのか

i=0nFi=Fn+21\sum_{i=0}^n F_i=F_{n+2}-1 より、 Fn+2F_{n+2} が取れる状況で Fn+2F_{n+2} または Fn+1F_{n+1} を取らない事は出来ない

また、map 等で管理することにより、隣あう二連続の値を取る場合は考えないで良い(隣り合わないとり方で同じ数字を表せるため)

  • Fn+2F_{n+2} を取った場合: その後のとり方は複数ある

  • Fn+2F_{n+2} を取らなかった場合: 隣あう二連続の値を取ることは考えないのでその後のとり方は一意に定まる

よって最大 O(logM)\mathcal{O}(\log M) 個の分岐しか存在しないことが分かるので全体で O(log2M)\mathcal{O}(\log^2 M) で解ける

;