斐波那契數列 優化矩陣求法例項

2022-10-04 05:24:09 字數 1072 閱讀 4790

(一)遞迴

遞迴是最慢的會發生重複計算,時間複雜度成指數級。

複製** **如下:

long long fac(int n)

(二)迴圈

利用臨時變數來儲存中間的計算過程,加快運算。

複製** **如下:

long long fac(int n)

}return b;

}  (三)矩陣乘法+空間換時間(減少乘法,取模運算)

數列的遞推公式為:f(1)=1,f(2)=2,f(n)程式設計客棧=f(n-1)+f(n-2)(n>=3)

用矩陣表示為:

進一步,可以得出直接推導公式:

由於矩陣乘法滿足結合律,在程式中可以事先給定矩陣的64,32,16,8,4,2,1次方,加快程式的執行時間。(有些題目需要取模運算,也可以事先進行一下)。給定的矩陣次冪,與二進位制有關是因為,如下的公式存在解,滿足xi=:

為了保證解滿足 xi=,對上述公式的求解從右向左,即求解順序為xn,xn-1,xn-2,....,x1,x0。

完整**實現如下:

複製** **如下:

///求解fac(n)%100000,其中n為大於等於3的正整數

#include

#include

long long fac_tmp[6][4]=,   ///32次冪%100000

,  ///16次冪%100000

,   ///8次冪%100000

&nbs           ,   ///4次冪%100000

,   ///2次冪%100000

,   ///1次冪%100000

};void fac(int);

int main()

void fac(int k) ///k>=3

i=4;

while(i>=0)    ///對於小於32的k(16,8,4,2,1);

i--;

}a=(t00*2+t01*1)%100000;

printf("%lld\n",a);

}

本文標題: 斐波那契數列 優化矩陣求法例項

本文位址:

斐波那契數列求法

矩陣快速冪 模擬過程 眾所周知 斐波那契數列的定義是f n 1 f n f n 1 我們有兩種方式來實現 乙個是遞迴,乙個是動態規劃 int dfs int n int dfs03 int n return vec i 1 經典做法只要數一大就會超時,我們可以用矩陣快速冪進行優化,能將時間複雜度降到...

矩陣 斐波那契數列

利用矩陣來求解斐波那契數列的有關問題是acm題中乙個比較常見的題型。例 nyoj 148 斐波那契數列2 有關斐波那契樹列的規律詳見這裡。1 對於n 1,都有f n 與f n 1 互質。2 f n f i f n i 1 f i 1 f n i 現在說說怎麼利用矩陣來求解斐波那契數列。我們可以先儲存...

斐波那契數列的矩陣分治求法java實現

平時一般求fibonacci數列都是用遞迴求的,其實還可以利用矩陣的冪求,如果遞迴時間複雜度是指數的 2 n 而矩陣分治來求是logn的。為求a的n次冪,使用了分治法,複雜度為o log n 這個結論可以用數學歸納法證明。直接上 package edu.pku.ss.hlj public class...