fibonacci 數列的快速冪求法

2021-07-10 17:55:14 字數 967 閱讀 1102

fibonacci數列的經典解法,即遞迴解法,如下

int fib(int n)
**是十分簡潔,但有乙個問題,即重複求解子問題,複雜度以 n 的指數方式遞增。

改進的做法是避免掉重複計算,複雜度可優化到o(n),如下

int fib(int n)

return sum;

}

該方法依賴於這樣乙個事實

即轉化為矩陣求冪,而求冪有我們熟知的快速解法如下,

這樣可使得解法複雜度降至 o(log(n)),實現如下

struct mat

friend mat operator * (const mat& lhs, const mat& rhs);

};mat operator * (const mat& lhs, const mat& rhs)}}

return m;

}mat power(const mat& m, int exp)

mat val = power(m, exp/2);

if(exp%2) return m*val*val;

else return val*val;

}int fibonacci(int n)

當然,也可以祭出神器,因為斐波那契數列是有通項公式的啊,如下

實現如下

int fib(int n)

fibonacci數列矩陣快速冪

對於矩陣 1 1 1 0 的n次冪,第一行第二個元素 右上角 的元素即為fibonacci數列的第n項,由此可以根據矩陣的乘法計算fibonacci數列的元素值 矩陣的快速冪利用的也是冪乘的二分法,只不是換成了矩陣的乘法,可以用函式處理。可以定義乙個二維陣列的結構體 typedef struct m...

Fibonacci數列(矩陣乘法快速冪)

題目描述 定義 f0 f1 1,fn fn 1 fn 2 n 2 稱為fibonacci數列。輸入n,求fn mod q。其中1 q 30000。輸入描述 第一行乙個數t 1 t 10000 以下t行,每行兩個數,n,q n 109,1 q 30000 輸出描述 檔案包含t行,每行對應乙個答案。樣例...

Fibonacci數列 利用矩陣快速冪

fibonacci數列就形如 0,1,1,2,3,5,8,13,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 可以看出 第1項為0,第2項為1,第三項為1,第四項為2 第三項 第二項,第n項 第 n 1 項 第 n 2 項 即 f n f n 1 f n 2 設 a為m p 的矩陣,b為p ...