DP 矩陣加速

2021-07-02 06:35:52 字數 957 閱讀 6190

題目:

hiho第43周/hiho1162

題意:現有1*2的骨牌,求覆蓋k*n的方案數。

2≤k≤7,1≤n≤100,000,000

方法:dp,用矩陣快速冪加速

dp矩陣加速的基本思想即將一系列狀態看成乙個向量,轉移方程看成乙個矩陣,通過向量乘矩陣得出下一系列狀態,即當

由於k較小,可以用狀壓思想構造狀態轉移矩陣,以3為例:

0表示還未放骨牌,1表示已經放置了骨牌

則當前層111(7)可由上一層000(0),011(3),110(6)到達

當前層110(6)可由上一層001(1),111(7)到達

……則可以構造出矩陣

mat[s1][s2]表示是否可以從s1轉移到s2,構造基向量為第0層的全滿狀態為1,其他狀態均為0

#include#include#include#include#include#include#include#includeusing namespace std;

//#define debug

typedef long long ll;

int const cs[20] = ;

const int maxn=150;

struct mat ;

int n;//矩陣大小

int mod = 12357;

mat operator * (mat a, mat &b)

} }return c;

}mat operator ^ (mat a, long long k)

} while( k )

k >>= 1;

a = a*a;

#ifdef debug

for (int i = 0; i < n ; i++){

for (int j = 0; j < n ; j++){

cout<

HDU5863(dp,矩陣加速)

題意 用k種字元來組成另個長度為n,但是最大字串匹配為m的方案數。匹配必須相同位置連續。dp i j 表示現在構造了i長度,長度j字尾連續對應相等,那麼dp i j dp i 1 j 1 k,特別地,dp i 0 sigma dp i 1 j k 1 k 0 但是n很大,不能o n 轉移。所以要想到...

藍橋杯 壘骰子 矩陣加速dp

壘骰子賭聖atm晚年迷戀上了壘骰子,就是把骰子乙個壘在另乙個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧秘 有些數字的面貼著會互相排斥!我們先來規範一下骰子 1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,...

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

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。輸出格式 每行輸出乙個非負整數表示答案。矩陣加速裸題 和我的前一篇基本一模一樣 只不過改變了要乘的...