在次线性时间内计算线性递归数列
date: 2019-09-13 简介 标题看着很高端,其实就是在 \(O(\log_2 N)\) 内计算出线性递归数列的某一项 (好像什么都没有解释清楚啊) 。 斐波那契数列的快速计算 我们先来看一个题目: 题目描述: 给你一个数字 \(n\) ,你需要输出斐波那契数列的第n项。 注意: 第一项和第二项都为 \(1\) 。 题目输入: 第一行一个整数 \(n\) ,保证$1 \leq n \leq 1e18 $。 题目输出: 输出斐波那契数列的第n项,对 \(1e9+7\) 取模。 这道题目小数据范围内很简单 (一道水题) ,但是当数据范围扩展到 \(1 \leq n \leq 1e18\) 时,一切都不一样了。你需要一个 \(O(N \log_2 N)\) 的算法来解决它。这里我们需要用到矩阵运算。 递推式 斐波那契数列的递推式这个大家应该都会写吧。。。 算了我还是来写一下好了: \[ f_{i}=f_{i-1}+f_{i-2}\\ f_{0}=1\\ f_{1}=1 \] 转化为矩阵计算 这里我们把计算 \(f_0\) 和 \(f_1\) 包含在一个2行1列的矩阵中: \[ \begin{pmatrix} f_{0}\\ f_{1} \end{pmatrix} \] 之后我们可以得出如下的式子: \[ \begin{pmatrix} 0&1\\ 1&1