題目鏈結: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 ...