Official

C - Calculator Editorial by maroonrk_admin


操作 \(4 \rightarrow 3 \rightarrow 4 \rightarrow 3 \rightarrow \cdots\) と続けることを考えます. ここで,操作を合計 \(S\) 回行ったとします. 便利のため,\(S\) は偶数であるとします.

任意の \(i\) (\(0 \leq i \leq S\)) について,\(i\) 回目の操作後に操作 \(1\) か操作 \(2\) を行うことを考えます. すると,以下のことがわかります.

  • \(i\) が偶数の場合:操作 \(1\)\(1\) 回行うたびに,最終的な \(x\) の値が \(fib(S-i)\) 増える.
  • \(i\) が奇数の場合:操作 \(2\)\(1\) 回行うたびに,最終的な \(x\) の値が \(fib(S-i)\) 増える.

ただしここで,\(fib(n)\) はフィボナッチ数(\(fib(0)=1,fib(1)=1,fib(n)=fib(n-1)+fib(n-2) \) for \(2 \leq n\))を表します.

\(i\) について,高々 \(1\) 回だけ操作 \(1\) or \(2\) を行うことを考えてみます. この場合,\(S\) の値としては,\(fib(S) \leq 10^{18}\) となる最大の \(S\) を選べばよいです.それ以上大きい \(S\) は無駄であるためです. 実際に計算すると \(S=86\) を選べばよいとわかります.

あとは,\(fib(S-i)\) の和で \(N\) を作る問題を解けばよいです. これは,\(i\) の小さい方から,操作が行えるなら行う貪欲をすればよいです. この時,\(i\)\(i+1\) 両方で操作することはありません. なぜなら,その場合は \(i-1\) で操作すればいいからです. よって,操作 \(1\) or \(2\) の回数は \(S/2+1=44\) で抑えられます. (なお,実際には最大で \(43\) 回です)

よって,全体の操作回数が \(86+44=130\) 回で抑えられ,この問題が解けます.

posted:
last update: