ARC122-Aの備忘録
問題
要点
- DPに強くなりたい
- AtCoder Libraryは偉大
すぐに考えついたこと
- 普通にO(n2)は無理
- それぞれの数字に付く+の数と-の数出すと良さそう?
- 思いつかないので要素全て1で手書き全列挙してパターン探る(DPを頭から外す)
列挙した
- N = 7まで手書き全列挙した
- -の数が鍵となりそうなので数える
数えた
- N=2 {1}
- N=3 {1, 1}
- N=4 {2, 1, 2}
- N=5 {3, 2, 2, 3}
- N=6 {5, 3, 4, 3, 5}
N=7 {8, 5, 6, 6, 5, 8}
左右対象(当然)で予想が立てられそう
- N=2の時,数列は{1}
- N=3の時,数列は{1, 1}
- N=n(>3)の時,数列のn/2までの要素は同じindexであるN=n-1の要素とN=n-2の要素の和
- "良い式"の数はFibonacci数?
- とりあえずこれを実装する
実装した
- どうやってもO(n2)になる
- この手法では無理そう
- よくみたら-を表す数列の要素もFibonacci数と関連しそう
- 具体的には左からi番目のマイナスの数が欲しい時は,N-i番目のFibonacci数とi番目のFibonacci数の積になりそう
- ここに気づくのに1時間55分
- 数列をよくみて気づくべきだった
- (証明したい)
- 具体的には左からi番目のマイナスの数が欲しい時は,N-i番目のFibonacci数とi番目のFibonacci数の積になりそう
実装した(2)
- 実装途中でコンテスト終了
- mod 1010+7 に翻弄された
- 最後の3つのテストケースが通らない
- 他の人の回答見ていたらAtCoder Libraryのなかにmodintという自動でmod取ってくれる便利なものがあるらしい
実装した(3)
- 通った
- 解説読んだ DPをさくっと思いつけるようになりたい
まとめ
- DPは偉大
- AtCoder Libraryは偉大
- 経験積もう