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