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