SPOJ FIBOSUM && FIBOSUM2

Fibonacci数列定义为

$$f_n = f_{n-1}+f_{n-2}, ext{以及初值}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$,则

$$egin{bmatrix} 1 & 1 & 0 \ 0 & 1 & 1 \ 0 & 1 & 0 end{bmatrix} egin{bmatrix} s_{n-1} \ f_n \ f_{n-1} end{bmatrix} = egin{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 = egin{bmatrix} 1 & 1 \ 1 & 0 end{bmatrix}$$

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

$$M^n = egin{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 ight)_{01} = sum_{i=x}^y f_i$$

进而

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

借此我们令

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

可以验证

$$A^n egin{bmatrix} 0 \ M^c end{bmatrix} = egin{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 imes 10^9+16$,并且

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

于是

$$s_n equiv s_{n mod (2 imes 10^9+16)}.$$

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

P.S. 可构造3阶矩阵。令

$$ A = egin{bmatrix} 1 & 1 & 0 \ 0 & f_{k+1} & f_k \ 0 & f_k & f_{k-1}  end{bmatrix}. $$

$$ A^n egin{bmatrix} 0 \ f_{k+c} \ f_{k+c-1} end{bmatrix} = egin{bmatrix} s_n \ f_{k(n+1)+c} \ f_{k(n+1)+c-1} end{bmatrix}. $$

其特征函数$f(lambda) = lambda^3 - a_1 lambda^2 - a_2 lambda - a_3$,其中 $a_1 = f_{k+1}+f_{k-1}+1, a_2 = f_k^2-f_{k+1}f_{k-1}-f_{k+1}-f_{k-1}, a_3 = f_{k+1}f_{k-1}-f_k^2$。时间复杂度$O(3^2 log n)$。

原文地址:https://www.cnblogs.com/TinyWong/p/7440041.html