前言思路:是的,沒錯,斐波那契數列除了遞推、遞迴演算法之外,還有更加高效的求解方法,那就是矩陣運算+快速冪。
可以先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n 項。
首先我們定義向量
xn=[an an−1],邊界:x1=[a1 a0]
然後我們可以找出矩陣:
a =[
1110
]a=\left[ \begin 1 & 1 \\ 1& 0 \end \right]
a=[11
10]
則有:xn=xn−1×a
所以:xn=x1×an−1
由於矩陣具有結合律,所以我們可以先求出 an−1%p,然後再用 x1左乘,即可求出 xn,向量 xn 的第乙個元素就是 an。
具體實現:
#include
#include
#include
#include
#include
using namespace std;
const int mod
=1000000007
;void
mul(int a[
2], int b[
2], int c[
2]),
};for(int i =
0; i <
2; i ++
)for
(int j =
0; j <
2; j ++
)for
(int k =
0; k <
2; k ++
)for
(int i =
0; i <
2; i ++
)for
(int j =
0; j <
2; j ++
) c[i]
[j]= temp[i]
[j];
}int f_final
(long long n)
; int res[
2]=,
};int t[
2]=,
};long long k = n -1;
while
(k) int c[2]
=;for(int i =
0; i <
2; i ++
)for
(int j =
0; j <
2; j ++
)return c[0]
;}int main()
說明: 斐波那契數列求解
斐波那契數列是一種常見的數列,其滿足下面兩個條件 f0 f1 1 fn fn 1 fn 2 斐波那契數列求解def fib1 n if n 2 return 1 return fib1 n 1 fib1 n 2 不適用遞迴 python def fib2 n f1 f2 1 for i in ran...
Matlab求解斐波那契數列
下面是乙個matlab的指令碼函式,用於求解菲波那切數列,而且可以判斷輸入是否符合實際情況 function fibona n 斐波那契數列,前兩項之和等於第三項 f n f n 1 f n 2 第一項和第二項分別都是1 f 1 1,f 2 1 程式主題 if n 3 disp n warning ...
10 求解斐波那契數列
寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 1000000007 如計算初...