前置芝士:矩陣
矩陣乘法
這兩個芝士並不是很難
重點可能在應用方面
首先介紹我所理解的廣義的矩陣乘法:現在我們手上有兩個矩陣\(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 ...