佳佳的 Fibonacci

可持久化自行车發表於2024-04-03

和 lyh 想的差不多,我認為我寫的會更詳細一些。

dyc 好厲害。完全想不到這樣的做法。

給你兩個整數 \(n\)\(m\),讓你求以下式子的值。

\[T(n) = \sum_{i=1}^{n} f(i)\times i\bmod m \]

對於斐波那契數列 \(f(n)=f(n-1)+f(n-2)\) 這樣的性質,使用字首和化簡式子是個好東西。

式子就變成了

\[T(n) = \sum_{i=1}^{n} s(n)-s(i-1) \]

提出 \(s(n)\),結合一下斐波那契數列的結論 \(s(i)=f(i+2)-1\),進行代入。

\[T(n) = n\times s(n)-\sum_{i=1}^{n}s(i-1) \]

\(\sum\) 進行化簡

\[T(n) = n\times f(n+2)-n-\sum_{i=1}^{n} f(i+1) +n \]

剩下的步驟很容易了。

\[\begin{aligned} T(n) &= n\times f(n+2)-n-\sum_{i=2}^{n+1} f(i)+n \\ &= n\times f(n+2)-n-\sum_{i=2}^{n+1}f(i)+f(1)-f(1)+n\\ &=n\times f(n+2)-n-\sum_{i=1}^{n+1}f(i) - f(1) +n\\ &=n\times f(n+2)-s(n+1)-1\\ &=n\times f(n+2)-(f(n+3)-1)-1\\ &=n\times f(n+2)-f(n+3)+2\\ \end{aligned}\]

矩陣快速冪加速遞推 \(f\) 即可,於是就用 \(\log\) 的優秀複雜度求 \(T(n)\) 了。

相關文章