Kiki & Little Kiki 2 HDU - 2276

原题链接

考察: 矩阵快速幂

思路:

         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 }

 

posted @ 2021-03-02 22:55  acmloser  阅读(57)  评论(0编辑  收藏  举报