きたまさ法メモ
T: フィボナッチ - Typical DP Contest | AtCoder
僕はこれの解法の理解に非常に時間がかかりました。
なので他の人もきっと時間がかかるよね?ということでメモを残します
まず数列 について
となるが与えられている
ここでf(n) = {}となる関数f(x)を定義する(つまりfは )
ただし
を満たす
つまり、
ここで, nが渡されるからf(n)をO(k^2 logn)で求める
愚直に行列累乗してしまうともちろんO(k^3 logn)
まず,f(n)がわかっている時に
f(n+1)はO(k)で求められる
これは簡単で
とすると
となり
よって結局
またf(n)がわかっていたら, f(2*n)がO(k^2)で求められる
まず、前述の方法により, f(n), f(n+1), f(n+2), ..., f(n+k-1)がO(k^2)で列挙できるのでする
とすると
となる(全部の項をn個ずらす)
ここで、f(n), f(n+1), f(n+2), ..., f(n+k-1)が列挙できていたとすると
この式の右側のは全てに分解できる
以上より, f(n) -> f(n+1) と f(n) -> f(2*n) の遷移が出来た またf(1)もわかっている
全てのnについて,1からスタートして+1と*2の操作をO(logn)回繰り返すことでnが作れれば良い
これはせいぜいDiv1easyぐらい