HDU 5434 矩陣快速冪

2021-07-09 12:39:48 字數 1521 閱讀 6935

題意:

有m*n矩陣,在上面放小象。

小象有攻擊範圍,為它的對角線所對應的四個單元格。但是小象有合成象的說法,即兩個小象邊相鄰時會發生攻擊範圍的改變。

問有多少種放置小象的方案,使得小象之間不會相互攻擊。

思路:

一種模型題,類似lightoj1332.求出關係後用矩陣快速冪遞推。

這題是用合法性來遞推的。列舉第一條的狀態和第二條狀態,看兩條是否能夠配上就可以。然後會得到乙個關係矩陣,問題就解決了。

原始碼:

···using namespace std;

const int maxn = 1 << 7;

struct matrix

void init(int _len)

matrix operator *(const matrix &rbs)const

}org;

matrix ppow(matrix a, int x, int m)

return ans;

} int g[maxn][maxn];

void init(int m)

if((1 << k) & j)

int temp = 0;

if(k > 0 && ((1 << (k - 1)) & i) && (((1 << (k - 1)) & j) == 0)) temp++;

if(k < m - 1 && ((1 << (k + 1)) & i) && (((1 << (k + 1)) & j)== 0)) temp++;

// if(i == 2 && j == 1 && k == 0)

if(temp) ok = 0;

} }

if(ok == 0) break;

} // if(ok)

if(ok == 0) cnt++;

g[i][j] = ok;

} }

// printf(「cnt = %d\n」, cnt);

org.init(1 << m);

for(int i = 0 ; i < (1 << m) ; i++) for(int j = 0 ; j < (1 << m) ; j++) org.d[i][j] = g[i][j];

} int main()

matrix ans = ppow(org, n - 1, m);

ll res = 0;

for(int i = 0 ; i < (1 << m) ; i++)

for(int j = 0 ; j < (1 << m) ; j++)

res = (res + ans.d[i][j]) % mod;

// printf(「ans\n」);

// for(int i = 0 ; i < (1 << m) ; i++)

// printf(「\n」);

// }

printf(「%i64d\n」, res);

} return 0;

} ···

hdu 4965 矩陣快速冪

給定兩個矩陣a,b,分別為n k和k n 求出矩陣c a b,矩陣m c n n 將矩陣m中的所有元素取模6,得到新矩陣m 並計算矩陣m 中所有元素的和 注意到ba 得到 6 6,而ab 得到1000 1000 轉化乘法算式為 m abababab.a ba n n 1 b 直接用矩陣快速冪即可 i...

快速矩陣冪HDU2276

題意 有n盞燈,編號為1到n。0表示不亮,1表示亮,如果 i th的燈的左邊燈是亮的,那麼下一秒鐘,i th燈的狀態要改變,0變成1,1變成0。第1個燈的 左邊是第n個燈 輸入t,輸入開始的狀態 問你在第t秒時,燈的狀態時什麼樣的,輸出來。分析 可推出下一秒的狀態a i a i 1 n n a i ...

快速矩陣冪HDU2254

題意 乙個有向圖,兩個頂點間可能有多條邊,視為不同的路徑,問從v1到v2之間的路徑長度大小在 t1,t2 的方案數mod 2008。輸入n條邊,p1,p2。因為p1,p2 2 32。但是總的頂點數不超過30.所以進行離散化即可。而且有可能t1 t2,所以要判斷一下。輸入的v1,v2可能也不在有向圖內...