矩陣 斐波那契數列

2021-06-07 00:41:46 字數 1839 閱讀 2842

利用矩陣來求解斐波那契數列的有關問題是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)。

現在說說怎麼利用矩陣來求解斐波那契數列。

我們可以先儲存b=f(1),a=f(0),然後每次設: b'=a+b a'=b。後利用a'和b'一直迴圈即可。同時我們可以將b a看做乙個向量[b a],前面的操作就可以乘以矩陣:

|1 1|*[b a]=[a+b b]。

|1 0|

也就是說,如果我們要求第100個fibonacci數,只需要將矩陣[1 0]乘上 

1 1 

1 0 

的一百次方,再取出第二項即可。就像題目中的描述一樣:設f

0 = 0,f

1 = 1,那麼有:

這個矩陣的n次方的形式是:

f(n+1)  f(n)

f(n)   f(n-1),

現在的問題是如何求出這個矩陣的n次方是多少?

可以使用的方法有兩種:

(1)、可以利用二分的思想:假設要求矩陣的n次方為a(n),設i=n/2若n%2==1,則 a(n)=a(i)*a(i)*a(1)若n%2==0,則a(n)=a(i)*a(i)。

(2)、利用二進位制的思想:將n拆為二進位制數,譬如13=(1101)2那麼 a^13= a^8 * a^4 * a^1。這個在求快速冪模的時候經常用。具體見**,可做模板,寫的比較的亂:

#include#includeusing namespace std;

const int max=10;

#define __int64 long long

#define bit(n) 1<>num,num!=-1)

return m.result();

}

例題2:nyoj 507(斐波那契數列),只要寫出那個遞推關係式即可~其餘的直接套模板:

s(n)=f(0)2

+f(1)2

+f(2)2

+...+f(n)2

;s(n-1)=f(0)2

+f(1)2

+f(2)2

+...+f(n-1)2

。 所以:s(n)-s(n-1)=f(n)2

=x2f(n-1)2

+y2f(n-2)2

+2xyf(n-1)f(n-2)。

所以可以構造下面的矩陣:

這個時候就簡單了,具體見**:

#include#include#includeusing namespace std;

const int max=10;

#define __int64 long long

#define clr(arr,val) memset(arr,val,sizeof(arr))

int x,y,num;

class matrix

void init()

void unit() //初始化為單位矩陣

start=m*start;

return start.result();

}ostream& operator<

{ for(int i=0;i

斐波那契數列 矩陣乘法

f 1 1 f 2 1 f n f n 1 f n 2 n 2 且 n 為整數 題目描述 請你求出 f n mod 1000000007 的值。輸入輸出格式 輸入格式 第 1 行 乙個整數 n 輸出格式 第 1 行 f n mod 1000000007 的值 輸入輸出樣例 輸入樣例 1 5輸出樣例 ...

斐波那契數列 斐波那契數列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級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...