前置芝士
矩阵(你不会矩阵看这个干蛤)
矩阵加速
斐波那契数列,相信大家都耳熟能详。不就是 O ( n ) O(n) O(n)的时间复杂度嘛。
但是如果 n ≤ 2 ∗ 1 0 9 n\leq2*10^9 n≤2∗109,那该怎么做呢?
看到数据范围后,让人目瞪口呆!(某老师的 P o w e r P o i n t Power\ Point Power Point)
1 5 ∗ ( ( 1 + 5 2 ) k − ( 1 − 5 2 ) k ) \frac{1}{\sqrt5}*((\frac{1+\sqrt5}{2})^k-(\frac{1-\sqrt5}{2})^k) 51∗((21+5)k−(21−5)k)。(神都神了)
当然是矩阵加速辣!!
懵 × ∞ \times\infty ×∞。
想一想,这个鬼数据范围,怎么才能过?需要一个 O ( log n ) O(\log n) O(logn)的时间复杂度。怎么构造 O ( log n ) O(\log n) O(logn)?快速幂,矩阵快速幂。
加速矩阵的构造
勾重点了!!
令 f 1 = 1 , f 2 = 1 , f n = f n − 1 + f n − 2 ( n ≥ 3 ) f_1=1,f_2=1,f_n=f_{n-1}+f_{n-2}(n\geq3) f1=1,f2=1,fn=fn−1+fn−2(n≥3),也就是斐波那契数列。
若构造矩阵 A = [ f n f n − 1 ] A=\begin{bmatrix}f_n&f_{n-1}\end{bmatrix} A=[fnfn−1],考虑前一种状态,即 A ′ = [ f n − 1 f n − 2 ] A'=\begin{bmatrix}f_{n-1}&f_{n-2}\end{bmatrix} A′=[fn−1fn−2]。如果有矩阵 B B B能够满足 A ′ × B = A A'\times B=A A′×B=A,那么就可以直接用 [ f 2 f 1 ] × B n − 2 \begin{bmatrix}f_2&f_1\end{bmatrix}\times B^{n-2} [f2f1]×Bn−2就可以得到 f n f_n fn了!
所以关键在于如何构造矩阵 B B B。
下面介绍一种常用的方法:
如下:
f n = 1 ∗ f n − 1 + 1 ∗