hdu2276 矩阵构造
生活随笔
收集整理的這篇文章主要介紹了
hdu2276 矩阵构造
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
? ? ?給了n個燈泡的狀態(tài),他們繞成一個環(huán),0是滅,1是亮,每一秒燈泡的狀態(tài)都會改變,規(guī)則是如果當前這個燈泡的左邊的燈泡當前是狀態(tài)1,那么下一秒當前的這個燈泡狀態(tài)就改變0變1,1變0,最后問你m秒后的狀態(tài)。
思路:
? ? ?我們先找當前狀態(tài)和下一個狀態(tài)的關(guān)系(狀態(tài)也就是秒),我們可以抽象成這么一種關(guān)系,如果第i個燈泡的狀態(tài)是ai,那么下一秒的第i個燈泡的狀態(tài)是上一秒的(ai + ai-1)%2,這樣關(guān)系就出來了,我們構(gòu)造矩陣,現(xiàn)在就以n=5為例:
上一秒 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?下一秒
a1 a2 a3 a4 a5 ? ? 1 1 0 0 0 ? ?a1 a2 a3 a4 a5
? ? ? ? ? ? ? ? ? ?0 1 1 0 0
? ? ? ? ? ? ? ?* ? 0 0 1 1 0
? ? ? ? ? ? ? ? ? ?0 0 0 1 1
? ? ? ? ? ? ? ? ? ?1 0 0 0 1 ?
? ? ?給了n個燈泡的狀態(tài),他們繞成一個環(huán),0是滅,1是亮,每一秒燈泡的狀態(tài)都會改變,規(guī)則是如果當前這個燈泡的左邊的燈泡當前是狀態(tài)1,那么下一秒當前的這個燈泡狀態(tài)就改變0變1,1變0,最后問你m秒后的狀態(tài)。
思路:
? ? ?我們先找當前狀態(tài)和下一個狀態(tài)的關(guān)系(狀態(tài)也就是秒),我們可以抽象成這么一種關(guān)系,如果第i個燈泡的狀態(tài)是ai,那么下一秒的第i個燈泡的狀態(tài)是上一秒的(ai + ai-1)%2,這樣關(guān)系就出來了,我們構(gòu)造矩陣,現(xiàn)在就以n=5為例:
上一秒 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?下一秒
a1 a2 a3 a4 a5 ? ? 1 1 0 0 0 ? ?a1 a2 a3 a4 a5
? ? ? ? ? ? ? ? ? ?0 1 1 0 0
? ? ? ? ? ? ? ?* ? 0 0 1 1 0
? ? ? ? ? ? ? ? ? ?0 0 0 1 1
? ? ? ? ? ? ? ? ? ?1 0 0 0 1 ?
ok然后就矩陣快速冪了,還有提示下,矩陣是不滿足交換律的,也就是說如果把5*5的矩陣放在前面,然后* 初始矩陣=下一個狀態(tài),這樣構(gòu)造出來的矩陣會和上面不同,但兩個都是對的,最后乘出來的答案一樣(只要別吧各自的順序弄錯了)。
#include<stdio.h> #include<string.h> typedef struct {int mat[105][105]; }A;A mat_mat(A a ,A b ,int n) {A c;memset(c.mat ,0 ,sizeof(c.mat));for(int k = 1 ;k <= n ;k ++)for(int i = 1 ;i <= n ;i ++)if(a.mat[i][k])for(int j = 1 ;j <= n ;j ++)c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % 2;return c; }A Quick_mat(A a ,int b ,int n) {A c;memset(c.mat ,0 ,sizeof(c.mat));for(int i = 1 ;i <= n ;i ++)c.mat[i][i] = 1;while(b){if(b&1) c = mat_mat(c ,a ,n);a = mat_mat(a ,a ,n);b >>= 1;}return c; }int main () {int n ,i ,j ,m;int num[105];char str[105];A aa;while(~scanf("%d" ,&m)){scanf("%s" ,str);n = strlen(str);for(i = 1 ;i <= n ;i ++)num[i] = str[i-1] - '0';memset(aa.mat ,0 ,sizeof(aa.mat));aa.mat[1][1] = aa.mat[n][1] = 1;for(i = 2 ;i <= n ;i ++)aa.mat[i-1][i] = aa.mat[i][i] = 1;aa = Quick_mat(aa ,m ,n);for(i = 1 ;i <= n ;i ++){int now = 0;for(j = 1 ;j <= n ;j ++)now = (now + num[j] * aa.mat[j][i]) % 2;printf("%d" ,now);}puts("");}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu2276 矩阵构造的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4973 线段树(题目不错,用了点
- 下一篇: ZOJ3715 竞选班长求最小花费