斐波那契数列定义:
f
i
=
1
(
i
∈
[
1
,
2
]
)
f_i=1(i\in[1,2])
fi=1(i∈[1,2])
f
i
=
f
i
−
1
+
f
i
−
2
(
i
>
2
)
f_i=f_{i-1}+f_{i-2}(i>2)
fi=fi−1+fi−2(i>2)
递推式明显,求
f
n
f_n
fn的话
O
(
n
)
O(n)
O(n)就珂以搞出来。
你觉得很快了?
还可以优化。
前置知识:
矩阵快速幂
对于每一个
f
i
f_i
fi,只需要知道
f
i
−
1
和
f
i
−
2
f_{i-1}和f_{i-2}
fi−1和fi−2既珂。
定义列向量
D
=
[
f
i
f
i
−
1
]
D= \left[ \begin{matrix} f_i\\f_{i-1} \end{matrix} \right]
D=[fifi−1]
于是我们只要求出
[
f
n
f
n
−
1
]
\left[ \begin{matrix} f_n\\ f_{n-1}\\ \end{matrix} \right]
[fnfn−1]
的矩阵,然后访问
(
1
,
1
)
(1,1)
(1,1)就珂以了。
考虑如何从前一个矩阵转移到下一个矩阵?
f
i
=
f
i
−
1
×
1
+
f
i
−
2
×
1
f_i=f_{i-1}\times1+f_{i-2}\times1
fi=fi−1×1+fi−2×1
f
i
−
1
=
f
i
−
1
×
1
+
f
i
−
2
×
0
f_{i-1}=f_{i-1}\times1+f_{i-2}\times0
fi−1=fi−1×1+fi−2×0
于是得到:
[
f
i
−
1
f
i
−
2
]
×
[
1
1
1
0
]
=
[
f
i
f
i
−
1
]
\left[ \begin{matrix} f_{i-1}\\ f_{i-2}\\ \end{matrix} \right] \times \left[ \begin{matrix} 1&1\\ 1&0 \end{matrix} \right]= \left[ \begin{matrix} f_i\\ f_{i-1} \end{matrix} \right]
[fi−1fi−2]×[1110]=[fifi−1]
然后展开,合并,得到:
[
f
n
f
n
−
1
]
×
[
1
1
1
0
]
n
−
2
=
[
f
2
f
1
]
\left[ \begin{matrix} f_{n}\\ f_{n-1}\\ \end{matrix} \right] \times \left[ \begin{matrix} 1&1\\ 1&0\\ \end{matrix} \right]^{n-2}= \left[ \begin{matrix} f_2\\ f_1 \end{matrix} \right]
[fnfn−1]×[1110]n−2=[f2f1]
初始化套进去,快速幂完事。
终结。
水的好爽