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 0sample output6 10 2
0解題思路:60
本題有多組測試,給定公式f[n] = f[n-1] * f[n-2] ( n > 1 ) ,每組測試給出三個整數a,b,n,a與b分別為第一位與第二位的值,n為需要求出的位。
我們根據給出的公式繼續向下尋找規律
f[0] =a這個題已經簡化為了求a的斐波那契數列n-1項次冪 * b的斐波那契數列n項次冪。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
) 找到了規律!獲得了巨大的快樂
斐波那契數列第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 2using
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...