P1962 斐波那契數列

2022-03-04 20:58:03 字數 1266 閱讀 6898

• 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

輸出樣例#2:

55

對於 60% 的資料: n ≤ 92

對於 100% 的資料: n在long long(int64)範圍內。

solution:

本題算是矩陣加速的模板題,而矩陣加速我好像寫過部落格,這裡稍微提一下我的理解。首先求出線性通項遞推式,然後構造矩陣,套用快速冪的思想,便能快速求出第n項了。複雜度是o(r2logn),其中r為矩陣的邊長,顯然r越小越好,幾乎可以當作乙個常數。

好了說說斐波拉契的遞推式:f[n]=f[n-1]+f[n-2],f[1]=f[2]=1。

於是可以構造初始矩陣 \begin f[2]=1 & f[1]=1\end 以及

中間矩陣 \begin 1 & 1 \\ 1 & 0 \end

最後就是輸出特判一下就ok了。

**:

#include#define il inline

#define ll long long

#define debug printf("%d %s\n",__line__,__function__)

using

namespace

std;

const

int mod=1e9+7

;ll n;

struct mat;

il mat mul(mat x,mat y)

il void

fast(ll k)

p=mul(p,p);

k>>=1

; }

cout

<0][0];}

intmain()

P1962 斐波那契數列

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

P1962 斐波那契數列

傳送門 斐波那契數列 看一眼果斷遞推 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 ...

矩陣 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...