P1962 斐波那契數列

2022-05-20 02:52:30 字數 900 閱讀 2679

傳送門

斐波那契數列

看一眼果斷遞推

f[ i ] = f[ i-1 ] + f[ i-2 ] 嘛

資料一看..

好像不行....

那就矩陣優化一下嘛

最基礎的矩陣乘法嘛 (不懂先學一下 矩陣乘法 吧)

稍微想一想:

設矩陣為 a

那麼矩陣 [  f[i-2]   ,   f[i-1]  ] * a 要等於 [  f[i-1]   ,   f[i]  ](即要等於 [ f[i-1]   ,   f[i-1]+f[i-2]  ])

a = [ 0,1 ]

[ 1,1 ]

然後就可以把 初始矩陣乘上 n 個 a

顯然初始矩陣為[ 1,1 ](設為b)

那麼答案就是b*a*...*a(一共n-1個a)

因為矩陣乘法滿足結合律

所以變一下就是b*(a^n)

然後就可以用快速冪來求a^n啦

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const ll mo=1000000007

;ll x;

struct

matrix

matrix

operator * (matrix &tmp)

//過載一下乘號

}ans,y;

intmain()

//過載了乘號就可以直接快速冪了

cout<1][1];//

矩陣的第一項就是答案

return0;

}

P1962 斐波那契數列

fn表示數列的第n項 那麼我們如果把fn,fn 1寫成蒟陣的形式,可以按照如下推導過程對這個蒟陣進行拆分,從而寫成便於計算的形式 如圖,這個是可以寫成蒟陣 和相乘的形式的,而 這個蒟陣可以用蒟陣快速冪來計算,具體可以見我的部落格 下面是 include include include include...

P1962 斐波那契數列

f 1 1 f 2 1 f n f n 1 f n 2 n 2 且 n 為整數 請你求出 f n mod 1000000007 的值。輸入格式 第 1 行 乙個整數 n 輸出格式 第 1 行 f n mod 1000000007 的值 輸入樣例 1 5 輸出樣例 1 5 輸入樣例 2 10 輸出樣例...

矩陣 P1962 斐波那契數列

嗯 include include include include include define ll long long using namespace std struct jv a,ans,c ll n,mo 1000000007 jv cheng jv a,jv b int main n 3...