m斐波那契數列f[n]是一種整數數列,它的定義如下:
f[0] = a
f[1] = b
f[n] = f[n-1] * f[n-2] ( n > 1 )
現在給出a, b, n,你能求出f[n]的值嗎?
寫出幾項便發現,a 的指數是 fib[n - 1], b 的指數是 fib[n],實際上是求斐波那契數列+快速冪。
特別的,mod 是素數,故可以利用費馬小定理。
a^(p-1)≡1(mod p)
特別注意!本題中應用費馬小定理的指數是通過矩陣快速冪求得的。在快速冪中的mod 都得是 mod - 1!而不能在求出結果後搞乙個 % (mod - 1)!這太傻了。是的,太傻了。
#include
#include
#include
using namespace std;
typedef long long ll;
typedef vector vec;
typedef vector mat;
int mod = 1000000007;
int a, b, n;
mat mul(mat a, mat b)
mat pow(mat a, ll n)
return b;
}int main()
mod = 1000000006;//mod - 1
mat a(2, vec(2));
a[0][0] = a[0][1] = a[1][0] = 1, a[1][1] = 0;
a = pow(a, n - 1);
mod ++;
mat t1 (1, vec(1));
t1[0][0] = a;
t1 = pow(t1, a[1][0]);
mat t2 (1, vec(1));
t2[0][0] = b;
t2 = pow(t2, a[0][0]);
cout << t1[0][0] * t2[0][0] % mod << endl;
}return 0;
}
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...