SPOJ FIBOSUM && FIBOSUM2

Posted liouzhou_101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPOJ FIBOSUM && FIBOSUM2相关的知识,希望对你有一定的参考价值。

Fibonacci数列定义为

$$f_n = f_{n-1}+f_{n-2}, \text{以及初值}f_0=0, f_1=1.$$

本文之讨论,皆在模$10^9+7$意义下。

 

FIBOSUM

给定$0 \le x \le y \le 10^9$,求$\sum_{i=x}^y f_i$。

解:

令$s_n = \sum_{i=1}^n f_i$,则

$$\begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} s_{n-1} \\ f_n \\ f_{n-1} \end{bmatrix} = \begin{bmatrix} s_n \\ f_{n+1} \\ f_n \end{bmatrix}$$

于是$\sum_{i=x}^y f_i = s_y - s_{x-1}$,可用矩阵快速幂$O(\log x + \log y)$解决。

 

FIBOSUM2

给定$0 \le c < k \le 2^{15}$,以及$0 < n \le 10^{18}$,求

$$\sum_{i=1}^n f_{ki+c}.$$

解:

$$M = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}$$

$$M \begin{bmatrix} f_n \\ f_{n-1} \end{bmatrix} = \begin{bmatrix} f_{n+1} \\ f_n \end{bmatrix}$$

$$M^n = \begin{bmatrix} f_{n+1} & f_n \\ f_n & f_{n-1} \end{bmatrix}$$

于是$(M^n)_{01} = f_n$,

$$\left( \sum_{i=x}^y M^i \right)_{01} = \sum_{i=x}^y f_i$$

进而

$$ \left( \sum_{i=1}^n M^{ki+c} \right)_{01} = \sum_{i=1}^n f_{ki+c}$$

借此我们令

$$A = \begin{bmatrix} I & M^k \\ 0 & M^k \end{bmatrix}$$

可以验证

$$A^n \begin{bmatrix} 0 \\ M^c \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n M^{ki+c} \\ M^{kn+c} \end{bmatrix}$$

可以利用矩阵快速幂在$O(4^3 \log n)$求得。

 

这样复杂度太高,我们继续优化。

设$f(\lambda) = \det (\lambda I - A)$是矩阵$A$的特征多项式,即

$$f(\lambda) = \lambda^4 - a_1 \lambda^3 - a_2 \lambda^2 - a_3 \lambda - a_4. $$

其中$a_1 = f_{k+1}+f_{k-1}+2, a_2 = -(f_{k+1}f_{k-1}-f_k^2+2(f_{k+1}+f_{k-1})+1), a_3 = 2(f_{k+1}f_{k-1}-f_kf_k)+f_{k+1}+f_{k-1}, a_4 = f_k^2-f_{k+1}f_{k-1}.$

由Hamilton-Cayley定理,$f(A) = 0$,即

$$A^4 = a_1 A^3 + a_2 A^2 + a_3 A + a_4 I.$$

于是我们可以利用多项式乘法,把$A^n$化为$A$的三次多项式。

假设$A^n = c_3 A^3 + c_2 A^2 + c_1 A^1 + c_4$,并令$s_n = \sum_{i=1}^n f_{ki+c}$,有

$$s_n = \sum_{i=0}^3 c_is_i = c_1s_1+c_2s_2+c_3s_3$$

时间复杂度$O(4^2 \log n)$。

 

我们仍可继续优化,考虑到Fibonacci数列在模$10^9+7$下的循环节是$2 \times 10^9+16$,并且

$$s_n = \sum_{i=1}^{2 \times 10^9+16} f_{ki+c} \equiv \sum_{i=1}^{2 \times 10^9+16} f_{i} \equiv 0 \pmod {10^9+7}.$$

于是

$$s_n \equiv s_{n \bmod (2 \times 10^9+16)}.$$

则可以把$n$限制到 int 范围内。

 

以上是关于SPOJ FIBOSUM && FIBOSUM2的主要内容,如果未能解决你的问题,请参考以下文章

spoj LCS2 - Longest Common Substring II && LCS - Longest Common Substring

SPOJ GSS3 (动态dp)

spoj1811 & spoj1812 - LCS1 & LCS2sam

SPOJ:Strange Waca(不错的搜索&贪心&剪枝)

HUSTOJ 2796 && SPOJ1811

spoj 839 OPTM - Optimal Marks&&bzoj 2440最小割