學習筆記 矩陣快速冪

2022-06-04 15:27:14 字數 1391 閱讀 8343

前置芝士:矩陣

矩陣乘法

這兩個芝士並不是很難

重點可能在應用方面

首先介紹我所理解的廣義的矩陣乘法:現在我們手上有兩個矩陣\(a\)和\(b\),我們期望得到乙個答案矩陣\(ans\) 其中\(ans[i][j]\ =\ ans[i][j]\ +\ (a[i][k]\ *\ b[i][k]) 其中 +\ * 代一種運算(如 min\ max 等等)\)

都可以用矩陣快速冪把遞推的時間從\(o(n)減到o(logn)\)

先放一下矩陣快速冪的**吧 模擬快速冪即可

#include#include#include#define ll long long

#define mod 1000000007

using namespace std;

ll m,k;

inline ll read()

struct map

void in()

void out()

}int main()

前面說了 矩陣快速冪重點在於應用

下面給出兩種我最近見到的題

p1939 【模板】矩陣加速(數列)

根據題目,我們的目標矩陣是這樣的

\[ \begin

f[i] \\

f[i - 1] \\

f[i - 2]

\end

\]然後我們發現

\[ \begin

f[i]=f[i−1]×1+f[i−2]×0+f[i−3]×1 \\

f[i−1]=f[i−1]×1+f[i−2]×0+f[i−3]×0 \\

f[i−2]=f[i−1]×0+f[i−2]×1+f[i−3]×00

\end

\]觀察係數 我們構造出這樣乙個遞迴矩陣

\[ \begin

1 & 0 & 1 \\

1 & 0 & 0 \\

0 & 1 & 0

\end

\]接下來就是套路的快速冪了

#include#include#include#define ll long long

#define mod 1000000007

using namespace std;

ll m = 3,k,t;

inline ll read()

struct map

void aiin()

void ansin()

}ai,ans;

map operator * (const map &a,const map &b)

void quick(ll k)

}int main()

else

quick(k),cout題目大意演算法就不再闡述 請看這裡

矩陣快速冪 學習筆記

首先,我們需要了解矩陣。矩陣說白了就是一堆數,排成長方形的形狀。然後就是矩陣的運算,加減都很簡單,這裡談一下乘法 所以矩陣相乘,一定是有其中乙個矩陣的行等於另乙個矩陣的列的。矩陣快速冪則和一般的快速冪的操作是一樣的,只是把乘法變成了矩陣乘而已,就像過載那樣。這裡還要說一下單位矩陣 對於n m n m...

矩陣快速冪學習筆記

其實會用快速冪已經有好長一陣子了,但是一直沒有寫一篇入門快速冪的筆記。據說,在遞推式優化上具有神奇的效果 效率很高 兩矩陣相乘,樸素演算法的複雜度是o n 3 如果求一次矩陣的m次冪,按樸素的寫法就是o n 3 m 既然是求冪,不免想到快速冪取模的演算法,這裡有快速冪取模的介紹,a b m 的複雜度...

矩陣快速冪 學習筆記

據說,矩陣快速冪在遞推式優化上相當神奇,而且效率很高。兩矩陣相乘,樸素演算法的複雜度是o n 3 如果求一次矩陣的m次冪,按樸素的寫法就是o n 3 m 既然是求冪,不免想到快速冪取模的演算法,這裡有快速冪取模的介紹,a b m 的複雜度可以降到o logb 如果矩陣相乘是不是也可以實現o n 3 ...