每日一題 斐波那鍥數列

2021-10-25 18:52:14 字數 3266 閱讀 9054

2020.10.13開始打卡每日一題

題目一:給定斐波那鍥的前兩項,求第n項斐波那鍥數列的值,因為數字很大,我們對結果mod(1e9+7)

題目二:給定整數n,代表台階數,一次可以跨2個或者1個台階,求多少種走法

題目三:假設農場中成熟的母牛每年會生一頭小母牛,並且永遠不會死(就是這樣)。第一年,農場只有乙隻成熟的母牛,從第二年開始,母牛開始生小母牛。每只小母牛三年之後成熟,又可以生小母牛。給定正數n,求n年後牛的數量。

題目四:給定乙個2n的網格,現在有若干大小為12的板磚(只能豎著或者橫著放,必),需要無縫緊密放到網格之中,返回多少種放法。

…其實這些都是斐波那鍥數列,非常有意思啊,哈哈哈哈哈哈。

const

int mod =

1000000007

;int

fabonacci

(int n)

顯然,計算的節點個數是 o(2^n) 的級別的,存在大量重複計算。

時間複雜度是 o(2n)o(2n),一秒內大約能算到第三四十項。

記錄已經計算過的狀態,每一次需要計算時查表,時間複雜度o(n)

const

int n =

100000

, mod =

1000000007

;int a[n]

;//計算這個數有沒有計算過

intfabonacci2

(int n)

迴圈遞推,時間複雜度還是o(n),但是需要開乙個長度是n的陣列,需要的記憶體是:

4 * n / (1024 * 1024)

const

int n =

100000000

, mod =

1000000007

;int

fabonacci3

(int n)

return a[n]

;}

其實我們只需要用前兩項來計算後一項,那麼如果我們只需要得到第n、項,不需要開乙個大的陣列。

時間複雜度不變,空間複雜度為o(1)

const

int mod =

1000000007

;int

fabonacci4

(int n)

return z;

}

我們知道快速冪可以用超快的速度計算出超過10^8級別的計算。通過找到項與項之間的關係,用矩陣的乘法去計算矩陣快速冪,次方可以用快速冪來優化。

矩陣快速冪:乙個函式用來計算矩陣的乘法,另乙個是計算矩陣的n次方。

const

int n;

int temp[n]

[n];

//快速冪的模板

void

multiplies

(int a[

][n]

,int b[

][n]

,int c[

][n]

)for

(int i =

0; i < n; i ++

)for

(int j =

0; j < n; j ++

) c[i]

[j]= temp[i]

[j];

}int res[n]

[n];

intfastpower

(int a[

][n]

,long

long n)

;//int res[2] = , };

memset

(res,0,

sizeof

(res));

for(

int i =

0; i < n ; i++

)//int t[2] = , };//轉移矩陣

//long long k = n - 1;

while

(n)

這道題呢,需要計算出轉移矩陣,然後計算n-1次方,

x1=【x1,x0】,那麼xn=【xn,xn-1】;

a=【1 1 1 0】;

xn=xn-1 * a;

遞推得到:xn=x1 * a^(n-1)

先計算a^n,然後再左乘乙個x1,就能得到xn,再取xn的第乙個元素就是答案

const

int n;

const

int mod =

1000000007

;void

multiplies

(int a[

2],int b[

2],int c[

2]),

};for(

int i =

0; i <

2; i ++

)for

(int j =

0; j <

2; j ++

)for

(int k =

0; k <

2; k ++

)for

(int i =

0; i <

2; i ++

)for

(int j =

0; j <

2; j ++

) c[i]

[j]= temp[i]

[j];

}int res[n]

[n];

intfastpower

(long

long n)

;//int res[2] = , };

memset

(res,0,

sizeof

(res));

for(

int i =

0; i < n ; i++

)int t[

2]=,

};//轉移矩陣

long

long k = n -1;

while

(k)int cur[2]

=;for(

int i =

0; i <

2; i ++

)for

(int j =

0; j <

2; j ++

)return cur[0]

;}

這其實模板題啊,懂原理學會運用就行。

近期預告:

線段樹、樹狀陣列、狀壓dp、trie樹、圖論

15 斐波那鍥數列

15.斐波那鍥數列 題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0,第1項是1 輸入 4返回值 3分析 1.遞迴思想,呼叫斐波那契數列,重複的自己呼叫自己 2.斐波那契數列就是當n 3的時候,結果為1 大於3的時候為f n 1 f n 2...

生成蛇形斐波那鍥數列

2021 8 81 滴滴筆試 題目描述 輸入 正整數n 輸出 n n的迂迴費波那契矩陣 首先寫出蛇形遍歷陣列過程 import numpy as np 蛇形遍歷二維陣列 n n int input strip data np.zeros n,n astype int top row n 1top c...

letcode每日一題 將陣列拆分成斐波那契序列

今天的每日一題用到了回溯演算法,這個我不是太熟悉,最後去借鑑了題解,但是不管怎麼說還是來記錄一下 回溯演算法簡介 public boolean panduan int prev,int index,int sum,string s,arraylistdeque long cuur long 0l 嘗...