(一)遞迴
遞迴是最慢的會發生重複計算,時間複雜度成指數級。
複製** **如下:
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...