HDU 4549 M斐波那契數列

2022-07-30 18:57:11 字數 2761 閱讀 6549

m斐波那契數列f[n]是一種整數數列,它的定義如下: 

f[0] = a  

f[1] = b 

f[n] = f[n-1] * f[n-2] ( n > 1 ) 

現在給出a, b, n,你能求出f[n]的值嗎?

input

輸入包含多組測試資料; 

每組資料佔一行,包含3個整數a, b, n( 0 <= a, b, n <= 10^9 )output對每組測試資料請輸出乙個整數f[n],由於f[n]可能很大,你只需輸出f[n]對1000000007取模後的值即可,每組資料輸出一行。

sample input

0 1 0

6 10 2

sample output

0

60

解題思路:

本題有多組測試,給定公式f[n] = f[n-1] * f[n-2] ( n > 1 ) ,每組測試給出三個整數a,b,n,a與b分別為第一位與第二位的值,n為需要求出的位。

我們根據給出的公式繼續向下尋找規律

f[0] =a  

f[1] =b

f[2] = a *b

f[3] = a * b * b = a * b^2

f[4] = a * b^2 * a * b = a ^2 * b ^3

f[5] = a ^2 * b^3 * a * b^2 = a^3 * b^5

f[6] = a^3 * b^5 * a^2 * b^3 = a^5 * b^8

f[7] = a^5 * b^8 * a^3 * b^5 = a^8 * b^13

f[8] = a^8 * b^13 * a^5 * b^8 = a^13 * b^21

……再觀察一手斐波那契數列f(n)

1、1、2、3、5、8、13、21

……哦,天哪!!!

f[n] = a^f(n-1) * b^f(n) ( n > 1

) 找到了規律!獲得了巨大的快樂

這個題已經簡化為了求a的斐波那契數列n-1項次冪 * b的斐波那契數列n項次冪。

斐波那契數列第n項和n-1項怎麼求,遞迴?——不行,n < 1e9 太龐大。

斐波那契數列公式f(n) = f(n - 1) + f(n - 2),我們拿出相鄰的兩項建立乙個2 * 1的矩陣

想要求斐波那契數列的第n項與第n-1項只需求出初始矩陣的n-1次冪即可,之後求出a的第n-1項次冪與b的第n項次冪即可。

這裡就要用到快速冪,與矩陣快速冪。

快速冪思想:求2^11,11的二進位制位1011,11 = 1*2^3  +  0*2^2  +  1*2^1  +  1*2^0,所以可以將2^11轉化為2^(2^0) * 2^(2^1) * 2(2^3)。將原先的11次 o(n)優化為了3次o(logn),本題要求取模,又因為積的取餘等於取餘的積的取餘,我們可以直接在快速冪的過程中取模以得到取模後的答案。

快速冪取模:

ll power(int a, int b, int mod)

a = a * a % mod; //

更新底數取模

b >>= 1; //

b右移一位

}

return

ans;

}

快速冪取模

矩陣快速冪與快速冪思想基本一直,只是傳入的底數變為了矩陣,乘法也變成了矩陣相乘,這時我們只要開乙個結構體記錄矩陣並過載*運算子為矩陣乘法即可,根據矩陣乘法運算規則,對於新的*運算我們只要兩層for迴圈,依次計算答案矩陣,之後再內部一層for迴圈讓第乙個矩陣只移動行第二個矩陣只移動列,對應相乘再求和即可得出答案。

struct

matrix}}

return ans; //

返回答案矩陣}};

matrix power(matrix a, ll b)

while

(b) b >>= 1

; a = a *a;

}return

ans;

}

矩陣快速冪

ac**

1 #include 2

using

namespace

std;

3 typedef long

long

ll;4

const ll mod = 1e9+7;5

const

int maxn = 2;6

struct

matrix17}

18}19return ans; //

返回答案矩陣20}

21};

22 matrix power(matrix a, ll b)

28while

(b)32 b >>= 1

;33 a = a *a;34}

35return

ans;36}

37ll pownum(ll a, ll b)

43 b >>= 1

;44 a = a * a %mod;45}

46return

ans;47}

48int

main()

49else

if(n == 1

)else73}

74return0;

75 }

HDU 4549 M斐波那契數列

解題思路 他和普通的斐波那契數列相似,但是是乘法,所以還要變形下,我們寫幾個式子就會發現一些規律 f 2 a 1 b 1 f 3 a 1 b 2 f 4 a 2 b 3 f 5 a 3 b 5 我們發現這裡a和b的冪是斐波那契數列,所以我們可以用矩陣快速冪來算,這裡要用到費馬小定理a p a mod...

hdu4549 M斐波那契數列

m斐波那契數列f n 是一種整數數列,它的定義如下 f 0 a f 1 b f n f n 1 f n 2 n 1 現在給出a,b,n,你能求出f n 的值嗎?input 輸入包含多組測試資料 每組資料佔一行,包含3個整數a,b,n 0 a,b,n 10 9 output 對每組測試資料請輸出乙個整...

HDU 4549 M斐波那契數列

先用矩陣快速冪計算出f n 含有a的個數和b的個數,再用快速冪算出答案 wa後才發現a b c並不等於a b c c 費馬小定理 c為質數且a,c互質,a b c a b c 1 c 那麼求冪次時mod 1就可以了 include include include include includeusi...