牛客題 又見斐波那契 (矩陣快速冪)

2021-08-19 23:34:31 字數 1016 閱讀 4013

題目鏈結:2023年湘潭大學程式設計競賽 - 又見斐波那契

給定遞推式

求f(n)的值,由於這個值可能太大,請對109+7取模。

因為資料範圍非常大(10的18次方)所以,一定存在o(1)或者o(logn) 的演算法的,而在(logn)中我們最可能用到的就是快速冪了,這個比較複雜一些,需要用到矩陣快速冪。

那麼如何得到矩陣快速冪呢,這就需要一些技巧

這a就是我們要求的矩陣,只要得到了這個a的值,後面就是簡單的快速冪了

從上圖可以看出來每個第一列的函式其實都可以由第二列組合而來,例如(i+1)³ = i³ + 3i² + 3i + 1而來的,根據這個係數,我們就可以在a中特定的位置上填上自己的值

由此可以得出矩陣a的值

ll a[6][6]=,,,

,,,};

那麼問題就解決了

#include

using namespace std;

const int mod=1000000007;

struct qx

, ,,,

,};};void create(qx &in)

qx qu(qx a,qx b,int g,int h,int p)

res.ma[i][j]%=mod;}}

return res;

}qx pow11(long long x)

b=qu(b,b,6,6,6);

x=x>>1;

}return res;

}int main()

qx initial;

create(initial);

qx ans=qu(pow11(n-2),initial,6,6,1);

cout

0;}

又見斐波拉契(矩陣快速冪)

傳送門 2018年湘潭大學程式設計競賽 g 這是乙個加強版的斐波那契數列。給定遞推式 求f n 的值,由於這個值可能太大,請對 10 9 7 取模。第一行是乙個整數t 1 t 1000 表示樣例的個數。以後每個樣例一行,是乙個整數 n 1 n 10 18 每個樣例輸出一行,乙個整數,表示f n mo...

斐波那契(矩陣快速冪)

斐波那契數列,即fib n fib n 1 fib n 2 fib n fib n 1 fib n 2 fib n fib n 1 fi b n 2 就這麼乙個數列,顯然可以直接遞推求解,時間複雜度o n o n o n 似乎沒什麼問題。然後就遇到了這個,n nn的取值範圍最大是2 1 09 2 t...

湘潭校賽 又見斐波那契(矩陣快速冪)

思路 這題一看資料範圍就知道是個矩陣快速冪,通過構造矩陣知我們需要的轉移矩陣為下圖形式,不過需要特判1然後輸出的是n 1的結果哦,因為這個我本題wa了 矩陣快速冪最難得就是構造矩陣,當矩陣構造出來之後基本上就好做了 實現如下 include include typedef long long ll ...