矩陣 P1962 斐波那契數列

2021-07-31 11:09:42 字數 1613 閱讀 3631

嗯……………………

**

#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;

a.n=a.m=2;

a.a[1][1]=a.a[1][2]=a.a[2][1]=1;

ans=a;

while(n)

c.n=2; c.m=1;

c.a[1][1]=c.a[2][1]=1;

ans=cheng(ans,c);

printf("%lld",ans.a[1][1]);

}

首先我們定義乙個struct

struct jv

};

更新矩陣的時候千萬不要把n,m漏掉;

那麼我們咋麼矩乘呢;

兩個矩陣

第乙個矩陣的列和第二個矩陣的行一定要相同;

所以我們可以把乙個矩陣的列與第二個矩陣的行相乘合併,組成乙個新的矩陣,新矩陣的行是第乙個矩陣的行,列是第二個矩陣的列;

新矩陣的[1,1]是第乙個矩陣的σ[1,k]*[k,1] (k=1->n)

新矩陣的[1,2]是第乙個矩陣的σ[1,k]*[k,2] (k=1->n)

…..

新矩陣的[i,j]是第乙個矩陣的σ[i,k]*[k,j] (k=1->n)

所以說相乘**

jv cheng(jv a,jv b)
這個就是模擬;

當然還是有優化的;

jv cheng(jv a,jv b)
這樣更快,快到飛起;

關於斐波那契;

我們先搞一刁矩陣;

我們先考慮怎麼跟新f[n-1],f[n-2]…

顯然只要把f[n]給f[n-1],f[n-1]給f[n-2]就好了;

所以斐波那契的矩陣

自己模擬模擬把

那麼對於f[n]

如果f[n]=f[n-1]-2*f[n-2]+6*f[n-3]

那麼

想通的話顯然得不行

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 斐波那契數列

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