HDU 2276 - Kiki & Little Kiki 2 (矩陣快速冪)
題意:
給你 n 棧燈圍成一圈,燈泡有兩種狀態開或者關 ,每秒燈泡的狀態都會發生變化,變化的規則為 : 如果這棧燈的前一棧燈(第一棧燈的前一棧是第 n 棧燈)是亮著的那麼這棧燈的狀態機會改變(開變為關,關變為開)。現給出燈的初始狀態,求 k (1<= k <= 1e8)秒後所有燈的狀態。
思路:
- 我們觀察到,每棧燈的狀態只由兩個位置的的狀態得到,其實就是這個位置和上一個位置的狀態異或一下。然後不難發現每一次狀態改變,只要把遞推矩陣的相應兩個位置設為 1,其他位置都是 0 就好了,再想一下 兩個位置異或 怎麼變成 加呢,其實就是 兩個位置狀態相加再對 2 取模(和異或的效果一樣),然後就可以直接快速冪遞推(如果是 4 棧燈 ,遞推矩陣如下)。
(1,0,0,1)
(1,1,0,1)
(0,1,1,0)
(0,0,1,1)
- 其實矩陣快速冪就是一個初始矩陣的 k 次遞推,只要找到一個遞推矩陣乘上初始矩陣後使它變成下一個狀態,那麼我們就可以利用矩陣乘法的結合律,先把遞推矩陣的 k次冪算出來 ,最後乘上初始矩陣,就達到了加速的效果,可以學習一下這篇文章矩陣快速冪(原理+模板)。
程式碼:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 1e2 + 7;
const int mod = 2;
ll n, k,m,cnt[31][31];
char s[maxn];
struct Matrix {
ll a[maxn][maxn];
Matrix() {
memset(a, 0, sizeof(a));
}
void init(){
for(int i = 1; i <= n; i ++){
a[i][i] = 1;
}
}
};
Matrix mul (Matrix x,Matrix y){
Matrix res;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int u = 1; u <= n; u++)
res.a[i][j] = (res.a[i][j] + x.a[i][u] * y.a[u][j]) % mod;
return res;
}
Matrix q_pow(Matrix base,ll temp){
Matrix ans;
ans.init();
while(temp > 0){
if(temp & 1) ans = mul(ans , base);
base = mul(base , base);
temp >>= 1;
}
return ans;
}
int main(){
while(scanf("%lld%s",&k,s + 1) != EOF){
n = strlen(s + 1);
Matrix x;
x.a[1][1] = x.a[1][n] = 1;
for(int i = 2; i <= n; i ++){ //構造遞推矩陣
x.a[i][i] = x.a[i][i-1] = 1;
}
Matrix anss = q_pow(x,k);
Matrix y;
for(int i = 1; i <= n; i ++){ //初始矩陣
y.a[i][1] = s[i] - '0';
}
anss = mul(anss , y);
for(int i = 1; i <= n; i ++){
printf ("%d",anss.a[i][1]);
}
printf ("\n");
}
return 0;
}
相關文章
- HDU 1575 Tr A(矩陣快速冪)矩陣
- HDU 4565 So Easy!(矩陣快速冪)矩陣
- HDU 4686 (推公式+矩陣快速冪)公式矩陣
- HDU 4965 Fast Matrix Calculation(矩陣快速冪)AST矩陣
- HDU 2157 How many ways?? (矩陣快速冪)矩陣
- HDU 1005 Number Sequence(矩陣快速冪)矩陣
- HDU 2256Problem of Precision(矩陣快速冪)矩陣
- HDU 1575 Tr A【矩陣快速冪取模】矩陣
- HDU 1005 Number Sequence:矩陣快速冪矩陣
- HDU5411CRB and Puzzle(矩陣快速冪)矩陣
- 矩陣快速冪矩陣
- HDU 4291 A Short problem(矩陣快速冪+迴圈節)矩陣
- HDU3221Brute-force Algorithm(矩陣快速冪&&指數降冪)Go矩陣
- 矩陣快速冪(快忘了)矩陣
- 矩陣快速冪總結矩陣
- 【矩陣乘法】【快速冪】遞推矩陣
- HDU 4549 M斐波那契數列(矩陣快速冪+費馬小定理)矩陣
- POJ 3613 Cow Relays 矩陣乘法Floyd+矩陣快速冪矩陣
- HDU 4549M斐波那契數列(矩陣快速冪+費馬小定理)矩陣
- P3390 【模板】矩陣快速冪矩陣
- 從斐波那契到矩陣快速冪矩陣
- bzoj3240: [Noi2013]矩陣遊戲(矩陣乘法+快速冪)矩陣遊戲
- BZOJ 3329 Xorequ:數位dp + 矩陣快速冪矩陣
- UVA 10655 Contemplation! Algebra (矩陣快速冪)矩陣
- POJ 3150 Cellular Automaton(矩陣快速冪)矩陣
- 費馬小定理 + 費馬大定理 + 勾股數的求解 + 快速冪 + 矩陣快速冪 【模板】矩陣
- POJ 2778-DNA Sequence(AC自動機+構建鄰接矩陣+矩陣快速冪)矩陣
- POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩陣快速冪取模)矩陣
- HDU 2157 How many ways??:矩陣快速冪【i到j共經過k個節點的方法數】矩陣
- 2014多校聯合第9場1006||hdu 4965 矩陣乘法和快速冪矩陣
- hdu 1757 矩陣連乘矩陣
- bzoj4887: [Tjoi2017]可樂(矩陣乘法+快速冪)矩陣
- 【構造共軛函式+矩陣快速冪】HDU 4565 So Easy! (2013 長沙賽區邀請賽)函式矩陣
- poj--2778DNA Sequence+AC自動機+矩陣快速冪矩陣
- LightOJ 1070 Algebraic Problem:矩陣快速冪 + 數學推導AI矩陣
- 計蒜客模擬賽D2T1 蒜頭君的兔子:矩陣快速冪矩陣
- HDU4565 So Easy! (矩陣)矩陣
- BZOJ3329: Xorequ(二進位制數位dp 矩陣快速冪)矩陣