zoukankan      html  css  js  c++  java
  • 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)$。

  • 相关阅读:
    循环
    rugarch包与R语言中的garch族模型
    Logistic回归
    机器学习缺失值处理方法汇总
    pandas库介绍之DataFrame基本操作
    python中常用的九种预处理方法
    谁动了我的特征?——sklearn特征转换行为全记录
    使用sklearn优雅地进行数据挖掘
    使用sklearn做单机特征工程
    彻底解决matplotlib中文乱码问题
  • 原文地址:https://www.cnblogs.com/TinyWong/p/7440041.html
Copyright © 2011-2022 走看看