考察: 矩阵快速幂
思路:
f[N]表示1~n栈灯在t 秒的状态,每盏灯只与它自己和它左边的灯有关.构造n*n的矩阵,在它自己和它左边的灯的位置取1,可以发现res[i] = (f[i-1]*a[j][i]+res[i])%2.
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 const int N = 110; 7 int f[N],t,len,a[N][N]; 8 char s[N]; 9 void mul(int f[],int a[][N]) 10 { 11 int res[N]; 12 memset(res,0,sizeof res); 13 for(int i=1;i<=len;i++) 14 for(int j=1;j<=len;j++) 15 res[i] = (f[j]*a[j][i]+res[i])%2; 16 memcpy(f,res,sizeof res); 17 } 18 void mulself(int a[][N]) 19 { 20 int res[N][N]; 21 memset(res,0,sizeof res); 22 for(int i=1;i<=len;i++) 23 for(int j=1;j<=len;j++) 24 for(int k=1;k<=len;k++) 25 res[i][j] = (a[i][k]*a[k][j]+res[i][j])%2; 26 memcpy(a,res,sizeof res); 27 } 28 int main() 29 { 30 while(scanf("%d",&t)!=EOF) 31 { 32 memset(a,0,sizeof a); 33 memset(f,0,sizeof f); 34 scanf("%s",s+1); 35 len = strlen(s+1); 36 f[0] = s[len]-‘0‘; 37 for(int i=1;i<=len;i++) f[i] = s[i]-‘0‘; 38 a[1][1] = a[len][1] = 1; 39 for(int i=2;i<=len;i++) 40 a[i-1][i] = 1,a[i][i] = 1; 41 while(t) 42 { 43 if(t&1) mul(f,a); 44 mulself(a); 45 t>>=1; 46 } 47 for(int i=1;i<=len;i++) printf("%d",f[i]); 48 printf("\n"); 49 } 50 return 0; 51 }
Kiki & Little Kiki 2 HDU - 2276
原文:https://www.cnblogs.com/newblg/p/14471932.html