矩陣加速遞推 入門指南

2021-06-23 02:26:43 字數 1033 閱讀 1144

首先是乙個例題,輸入n和m,問用1x2的方塊填滿4xn的格仔共有多少種方案數,答案對m取模。

分析問題可以找出所有狀態,用乙個1x4的位表示一行的方塊情況,0表示暫時為空,1表示恰好填入方塊。

雖然4個二進位制位共有16中可能,但是合法的方案數實際只有6中,0000、0011、0110、1001、1100、1111。

可以將其編號壓縮為0~5,不過16種方案也不是很多,不壓縮也可以。

以此類推出所有的狀態,這一步可以通過兩行列舉與一次判斷做到,由於本題列數只有4,因此手推也是可以的。

令f[i][j]表示狀態i能否到達狀態j,能置為1,不能置為0。

可以發現f是乙個nxn的矩陣(n是指狀態數),令d(s)表示當前行狀態為s的方案數,d'(s)為下一行狀態為s的方案數。

那麼d就是乙個1xn的矩陣,由矩陣乘法的性質顯然有 f x d = d'

如果將d初始化為第0行的狀態的話,那麼做幾次乘法運算就能得到第幾行的狀態。

利用矩陣快速冪來加速乘法運算。

得到最後一行的狀態d,那麼最後一行全部填滿的狀態1111的方案數就是所求的答案。

#include #include #include #include using namespace std;

const int maxn=1<<4;

int f[maxn][maxn];

int mod;

void init()

int n,m;

struct matrix

matrix(int _n,int _m)

void clear()

matrix geti(int n) const

return ans;

}};int main()

{ init();

while (~scanf("%d%d",&n,&m)){

if (n==0||m==0) break;

mod=m;

matrix a(maxn,maxn);

matrix f(maxn,1);

for (int i=0;i

矩陣加速遞推

關於矩陣加速數列遞推 給定乙個遞推數列 f i a 1 f i 1 a 2 f i 2 a k f i k 我們普通計算的話肯定是逐個計算,複雜度較大。我們可以用矩陣表示 left begin f i f i 1 f i k end right 為了遞推出 f n 我們需要找到乙個係數矩陣 a 使得...

矩陣性質 矩陣加速遞推

本文介紹線性代數中乙個非常重要的內容 矩陣 matrix 的乙個重要性質 矩陣加速遞推同時本文已經更新至 矩陣 matrix 系統介紹篇 斐波那契數列 fibonacci sequence 大家應該都非常的熟悉了。在斐波那契數列當中,f 1 f 2 1 f i f f i geq 3 如果有一道題目...

模板 矩陣加速(數列)(矩陣加速遞推)

a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。矩陣加速裸題 和我的前一篇基本一模一樣 只不過改變了要乘的...