斐波那契數列求法

2021-10-07 14:27:10 字數 2875 閱讀 6416

矩陣快速冪

模擬過程

眾所周知:斐波那契數列的定義是f(n + 1) = f(n) + f(n - 1)

我們有兩種方式來實現:乙個是遞迴,乙個是動態規劃

int

dfs(

int n)

int

dfs03

(int n)

return vec[i-1]

;}

經典做法只要數一大就會超時,我們可以用矩陣快速冪進行優化,能將時間複雜度降到o(logn)

(如果全位輸出斐波那契數,貌似最大能演算法到93,但是如果帶mod,那就可以算很大)

常用於求第n位斐波那契數的後x位(mod 10x)

快速冪+矩陣

矩陣乘法:左矩陣的第一行乘以右矩陣的第一列(分別相乘),乘完後相加

單位矩陣: nn的矩陣 mat ( i , i )=1; 任何乙個矩陣乘以單位矩陣就是它本身 n單位矩陣=n, 可以把單位矩陣等價為整數1。(單位矩陣用在矩陣快速冪中)

在斐波那契數列中:

f[n ] = 1 * f[n-1] + 1 * f [n - 2]

f[n-1] =1 * f[n-1] +0 * f [n - 2]

我們用矩陣來表示:

這就表示了斐波那契數列如何用矩陣來實現。

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int mod=

10000

;typedef vector vec;

typedef vector mat;

mat mul

(mat &a,mat &b)}}

return c;

} mat pow

(mat a,ll n)

return res;

} ll solve

(ll n)

intmain()

return0;

}

#include

using

namespace std;

typedef

long

long ll;

const ll mod=

1000000007

;struct matrix //定義結構體矩陣

;matrix mul

(matrix a,matrix b)

//矩陣乘法運算}}

return ans;

}matrix quickpow

(matrix p,ll n)

//矩陣快速冪,與快速冪道理方法相同

//一開始初始化他為單位陣

else ans.x[i]

[j]=0;

}}while

(n)//快速冪

p=mul(p,p)

; n>>=1;

}return ans;

}int

main()

;

ll n;

cin>>n;

ll ans1=0;

matrix ans=

quickpow

(m,n-1)

; cout<

[1]<

return0;

}

poj 3070

如果數很大,比如求1000的斐波那契數列,矩陣快速冪也求不出來,那咋辦?

我們可以模擬斐波那契數列數列計算的過程,斐波那契數列的定義是f(n + 1) = f(n) + f(n - 1),我們可以手寫加減,模擬進行加減運算

例題 大菲波數

h du - 1715

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

intmain()

;for

(i=0

;i2;i++)if

(b[j]

>=

'0')

if(temp>=10)

else

c[j+1]

=1+'0';}

else

else

}else}}

strcpy

(a, b)

;strcpy

(b, c)

;memset

(c,0

,sizeof

(c));}

int len=

strlen

(b);

for(i=len-

1;i>=

0;i--

)printf

("\n");

}return0;

}

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

迴圈斐波那契數列 斐波那契數列應用

什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...

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

一 遞迴 遞迴是最慢的會發生重複計算,時間複雜度成指數級。複製 如下 long long fac int n 二 迴圈 利用臨時變數來儲存中間的計算過程,加快運算。複製 如下 long long fac int n return b 三 矩陣乘法 空間換時間 減少乘法,取模運算 數列的遞推公式為 f...