1.題目鏈結。題目大意,有n個燈,它們圍城乙個圈,每個燈有兩種狀態,0代表燈沒有開,1代表燈開著。現在做這樣的調整,每一秒,我們檢查這個燈的左邊(就是逆時針相鄰的那個點),如果左邊的點是1,那麼把該點的燈開啟,否則不做變化。問t秒之後所有燈的狀態。
2.這是乙個矩陣的遞推,我們這樣考慮,a[i][j]代表第i秒這個點燈的狀態,1就是開著,0就是關閉。那麼我們在它的狀態一定是這樣來的:(a[i-1][j]+a[i-1][j-1])%2.就是上一輪這個點和它左邊的點決定了此時的狀態,那麼,對於所有的燈,我們可以列出n個這樣的方程,組成乙個方程組,並且寫成矩陣乘積的形式就是(用乙個三維的矩陣為例子):
左邊是初始的狀態,右邊是最終的結果,乘上轉移矩陣即可。所以分析到這裡,就是矩陣快速冪啦。問題解決。
#include#include#includeusing namespace std;
struct sarray
} sarray() {};
sarray operator *(const sarray&a)
}} return tem;
} sarray operator +(const sarray&a)
} return tem;
}};sarray qpow(sarray a, int b)
return tem;
}sarray ans;
int main()
}} sarray tem(len, 0);
for (int i = 0; i < s.size(); i++)
ans = tem * qpow(trans, t);
for (int i = 0; i < len; i++)
cout << endl;
}}
hdu2276 矩陣構造
題意 給了n個燈泡的狀態,他們繞成乙個環,0是滅,1是亮,每一秒燈泡的狀態都會改變,規則是如果當前這個燈泡的左邊的燈泡當前是狀態1,那麼下一秒當前的這個燈泡狀態就改變0變1,1變0,最後問你m秒後的狀態。思路 我們先找當前狀態和下乙個狀態的關係 狀態也就是秒 我們可以抽象成這麼一種關係,如果第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 ...
HDU6050 矩陣遞推
source 2017 multi university training contest team 2 題意 給定 n m 求 f 題解 首先對基礎遞推式 f f 2 times f 加乙個sigma,有 sum f sum f 2 sum f 即 f f 2 f 歸納下去可得 f f 2f 所以...