P1962 斐波那契数列
题目描述
大家都知道,斐波那契数列是满足如下性质的一个数列:
$$F_n = \left\{\begin{aligned} 1 \space (n \le 2) \\ F_{n-1}+F_{n-2} \space (n\ge 3) \end{aligned}\right.$$
请你求出 Fn mod 109 + 7 的值。
输入格式
一行一个正整数 n。
输出格式
输出一行一个整数表示答案。
输入输出样例 #1
输入 #1
1 | 5 |
输出 #1
1 | 5 |
输入输出样例 #2
输入 #2
1 | 10 |
输出 #2
1 | 55 |
说明/提示
【数据范围】
对于 60% 的数据,1 ≤ n ≤ 92;
对于 100% 的数据,1 ≤ n < 263。
解析
发现能找规律就很快,当然斐波那契公式也可以。
那么这里发现可以用矩阵乘法来做加法的工作,那么可能有人想问矩阵乘法的开销不是比普通二进制加法大N倍,但是我们可以快速幂啊!
这里是 2x2 的矩阵乘法
大概是这样的,矩阵乘法的结果C的 (i, j) 等于 矩阵A的第i行 与 矩阵B的第j列 的点积。 所谓点积,就是对应位置的元素相乘再相加。 也就是说
$$ C_{i,j} = \sum_{k=1}^n A_{i,k} \times B_{k,j} $$
那么假设我们有一个矩阵
$$ A = \begin{bmatrix} 1 & 1 \\ 0 & 0 \end{bmatrix} $$
其中(1,1) 和(2,1) 分别是斐波那契数列的第1项和第2项。 那么要得到斐波那契的下一项
$$ C = \begin{bmatrix} 2 & 1 \\ 0 & 0 \end{bmatrix} $$
我们可以利用一个因子
$$ B = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} $$
$$ AB = \begin{bmatrix} 1\times1+1\times1 & 1\times1+1\times0 \\ 1\times0+1\times0 & 1\times0+0\times0 \\ \end{bmatrix} $$
可以得到
$$ C = \begin{bmatrix} 2 & 1 \\ 0 & 0 \end{bmatrix} $$
注意到对于任意的 a = F(n), b = F(n − 1), c = F(n + 1),若有
$$ A = \begin{bmatrix} a & b \\ 0 & 0 \end{bmatrix} $$
$$ B = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} $$
则
$$ AB = \begin{bmatrix} a\times1+b\times1 & a\times1+b\times0 \\ a\times0+b\times0 & a\times0+b\times0 \\ \end{bmatrix} $$
即
$$ C = \begin{bmatrix} c & a \\ 0 & 0 \end{bmatrix} $$
则因为 Cn = ABn − 2,所以可以使用快速幂求 Bn − 2,然后与 A 相乘即可。
上代码
1 |
|