【矩陣快速冪】HDU 4549 : 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]的值嗎?對每組測試資料請輸出一個整數F[n],由於F[n]可能很大,你只需輸出F[n]對1000000007取模後的值即可,每組資料輸出一行。
【Source】 :2013金山西山居創意遊戲程式挑戰賽――初賽(2)
【解題思路】
這個題稍微有點難度,就是要考慮矩陣裡面巢狀矩陣,這樣的話,我們就要分別計算左右兩邊的值,然後再用一次快速冪求出最後的答案,
思考如下:
寫出F(2)、F(3)、F(4)、F(5)…會發現a和b的指數是fibonacci數,如果求出fib數列,用快速冪就可以快速求出最後答案。問題轉化為了如何快速求解fib數列。 因為【F(n-2),F(n-1)】*【0,1,1,1】 = 【F(n-1),F(n)】,所以可以用矩陣乘法來求。 每次相乘的矩陣為 0 1 1 1 為了防止求F(n)時溢位,要對矩陣元素取模,即 a[i][j] %= 1000000006。模數之所以為1000000006是因為根據
程式碼
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; const int MOD1=1e9+7; const int MOD2=1e9+6; #define LL long long struct Matrlc { LL map[2][2]; }; Matrlc unit = {1,0,0,1}; Matrlc mult(Matrlc a,Matrlc b) { Matrlc c; for(int i=0; i<2; i++) for(int j=0; j<2; j++) { c.map[i][j]=0; for(int k=0; k<2; k++) c.map[i][j]+=(a.map[i][k]*b.map[k][j])%MOD2; c.map[i][j]%=MOD2; } return c; } Matrlc pow1(Matrlc a,LL n) { Matrlc ans=unit; Matrlc res=a; while(n) { if(n&1) ans=mult(ans,res); res=mult(res,res); n>>=1; } return ans; } LL pow2(LL a,LL b) { LL res=1; LL ans=a%MOD1; while(b) { if(b&1) res=res*ans%MOD1; ans=ans*ans%MOD1; b>>=1; } return res; } int main() { LL A,B,N,i,j; Matrlc tmp; tmp.map[0][0]=0; tmp.map[0][1]=tmp.map[1][0]=tmp.map[1][1]=1; while(cin>>A>>B>>N) { Matrlc p=pow1(tmp,N); LL result=pow2(A,p.map[0][0])*pow2(B,p.map[0][1])%MOD1; printf("%lld\n",result); } return 0; }
相關推薦
【矩陣快速冪】HDU 4549 : M斐波那契數列(矩陣巢狀)
【題目大意】 M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a,
HDU 4549 M斐波那契數列(矩陣快速冪)
題目連結:M斐波那契數列 列舉幾項會發現$ F[n]=a^{fib(n-1)} * b^{fib(n)} $ 斐波那契數列用矩陣快速冪求即可。但是因為n很大,fib會爆掉。這時候可以引入費馬小定理。 證明:$a^x \% p = a^{x \%(p-1)} \%p$ 1.$a^x \% p = a^{
HDU 4549 M斐波那契數列 (矩陣快速冪+費馬小定理)
思路: 通過列出幾項我們就可以發現ab的指數是斐波那契數列。然後博主就開(智)心(障)的用矩陣快速冪算指數了。。 卻忘了一件事。。。誰說的取模對指數封閉的啊???md瘋狂wa了六七次。 取模對乘法
HDU 4549 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個
HDU 4549 M斐波那契數列(矩陣快速冪3)+費馬小定理
C - M斐波那契數列 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB
HDU 4549 M斐波那契數列(矩陣快速冪+費馬小定理)
M斐波那契數列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3476 Accepted Submi
HDU 4549 M斐波那契數列(矩陣快速冪+費馬小定理)
這道題以為是很水的矩陣快速冪,把矩陣{1,1,1,0}進行快速冪乘遞推,ans[0][0]為a的指數,ans[0][1]為b的指數,但是瘋狂wa,百度搜題解發現用到了費馬小定理,A^X = A^( X mod phi(M) ) ( mod M ),又因為M為質數,所以ph
hdu 4549 M斐波那契數列(矩陣高速冪,高速冪降冪)
else if stdlib.h article 1.0 ostream void 我們 memset font http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b
hdu 4549 M斐波那契數列(費馬小定理+矩陣快速冪)
F(n)=a^F(n-1)*b^F(n-2)%mod 因為a和b都與mod互素,因此用費馬小定理可以得到 F(n)=a^(f(n-1)%mod-1)*b^(f(n)%mod-1) %mod
hdu-4549 M斐波那契數列【矩陣快速冪】
找規律寫出f(2),f(3),f(4),f(5) .........可以發先 a b的係數是一系列的fib數列 如果可以求出fib數列 求快速冪就可以了 這樣問題就在於如何求fib數列了 1 1 【f[n
HDU --- 4549 M斐波那契數列 【費馬小定理+矩陣快速冪】
傳送門 思路: 通過把前面幾項手推出來可以發現, 其次方項符合斐波那契數列, 又因為資料非常大, 所以就可以想到用矩陣快速冪去求得次方項, 需要注意的就是我們求的是次方, 而答案是取的某個數的該次方, 而a^b % p != a^(b%p) % p, 所以就
HDU 4549 M斐波那契數列 (矩陣快速冪 + 費馬小定理)
M斐波那契數列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3645 Accepted Submi
HDU 4549 M斐波那契數列 (費馬小定理降冪&矩陣快速冪)
Problem Description M斐波那契數列F[n]是一種整數數列,它的定義如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 現在給出a, b, n,你能求出F[n]的值嗎? Inpu
HDU 4549 M斐波那契數列 (費馬小定理+矩陣快速冪)
分析: 寫出F[n]的幾項之後發現a和b的指數和斐波那契數列有關 具體的關係是 F[n]=a^fib[n-1] * b^fib[n] 矩陣快速冪求fib 快速冪求a和b的n次冪 題目要求對F[n]%mod 這
hdu 4549 M斐波那契數列
f(n)表示斐波那契數列的第n項 F(n) = a^f(n-1)*b^f(n) 這個推一下就知道了 然後f(n)可以用矩陣快速冪求 1 1 f(n+1) f(n) 1 0 的n次冪 = f(n)
HDU 4549 M斐波那契數列
HDU 4549 M斐波那契數列 M斐波那契數列F[n]是一種整數數列,它的定義如下: 題意:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )給
poj 3070 Fibonacci 【矩陣快速冪 求第N個斐波那契數%1000】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11123 Accepted: 7913 Descr
HDOJ 4549 M斐波那契數列 費馬小定理+矩陣快速冪
MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i ) ( i>=3) mod 1000000007 是質數 , 根據費馬小定理 a^phi( p ) = 1
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 輸入包含多組測試
[luoguP1962] 斐波那契數列(矩陣快速冪)
truct ons 技術 pan opera http 快速冪 printf ble 傳送門 解析詳見julao博客連接 http://worldframe.top/2017/05/10/清單-數學方法-——-矩陣/ —&