矩陣快速冪求fib

2022-09-01 13:30:13 字數 1844 閱讀 6184

qn是個特別可愛的小哥哥,qy是個特別好的小姐姐,他們兩個是一對好朋友 [ cp (劃掉~)

又是一年嚶花爛漫時,小qn於是就邀請了qy去嚶花盛開的地方去玩。當qy和qn來到了田野裡時,qy驚奇的發現,嚶花花瓣以肉眼可見的速度從樹上長了出來。

仔細看看的話,花瓣實際上是以一定規律長出來的,而且,每次張成新的花瓣的時候,上一次的花瓣就會都落到地上,而且不會消失。

花瓣生長的規律是,當次數大於等於2時,第i次長出來的花瓣個數和上一次張出來的花瓣個數的差是斐波那契數列的第i-1項。初始的時候地上沒有花瓣,樹上的花瓣個數為1,第一次生長的花瓣個數為1。初始的那個花瓣就落到了地上

現在,小qn想知道,經過k次生長之後,樹上和地上的總花瓣個數是多少?

ps:斐波那契數列:

f[1]=f[2]=1;f[i]=f[i-1]+f[i-2] (i>=2且i

n+) 

一行乙個數k
一行乙個數m,表示第k次生長過後,樹上和地上的總花瓣數是多少。由於答案會很大,請你將答案mod 998244353後輸出
示例1

複製

4
複製

12

第一次:樹上1,地上1.第二次樹上2,地上1+1,第三次樹上3,地上1+1+2,第四次樹上5,地上1+1+2+3。總共12個
示例2複製

5
複製

20

第五次樹上8,地上1+1+2+3+5。總共20個

對於0%的資料,有k=樣例

對於20%的資料,有k<=1'000

對於60%的資料,有k<=1'000'000

對於80%的資料,有k<=1'000'000'000

對於100%的資料,有k<1'000'000'000'000'000'000

題解:本題是求fib的前n項和

這裡有個結論,fib的前n項和=fib(n+2)-1

但是資料範圍。。。。異常大,所以一看,只能矩陣快速冪加速遞推了

先來講一講矩陣運算對於乙個n*m的矩陣,只有m*p的矩陣才能與其進行乘法,最後乘出來是n*p

的矩陣,對於乙個矩陣a,b

這道題用矩陣來寫是這樣的乙個操作

首先我們設f(n)=,那麼f(n-1)=

那麼矩陣f(n)的第一項等於矩陣f(n-1)的第二項,矩陣f(n)的第一項等於矩陣f(n-1)的第一項+第二項

實際上就等於

所以,求f(n)就相當於求f(0)*

那麼用快速冪處理

即可**:

#include#include

using

namespace

std;

typedef

long

long

ll;const ll mod=998244353

;ll f[5];

ll c[

5][5]=,,};

void

get()}f[

1]=a[1

]; f[

2]=a[2];}

void

self()}}

for (int i=1;i<=2;i++)

for (int j=1;j<=2;j++) c[i][j]=a[i][j];

}int

main()

printf(

"%lld

",f[1]-1

);return0;

}

hdu 5171 fib矩陣快速冪

題目 題意 給你n個數字,讓你用這些數字構造乙個最大的集合,其中可以選取m次最大的倆個數加入集合中,求最後集合中的數最大。multi test cases about 3 the first line contains two integers n and k 2 n 100000,1 k 1000...

矩陣快速求冪

今天看 劍指offer 看到乙個遞推關係 f n f n 1 f n 2 書中提出了一種簡單的演算法,也就是矩陣乘法 如果是n次方,那麼時間複雜度應該是o n 那麼有沒有一種更快的演算法呢?快速冪演算法能讓時間複雜度降至o logn 怎麼來做快速冪演算法呢?我們首先先想乙個簡單的,乙個數字a,求他的...

矩陣快速求冪

在只使用標準庫的情況下,c 沒有現成的處理矩陣的標準庫,所以矩陣的運算就比較麻煩,尤其是矩陣的乘法 加減法都可以對應位置做加減,乘法的運算相對比較複雜,冪運算又會帶來的大量的乘法運算,所以這裡記錄一種 矩陣快速求冪的方法。這種方法可以將運算降低至指數次,原理是這樣的 1.矩陣a的m次方,先把m分解成...