嗯……………………
**
#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 ...