hdu2276 快速矩阵幂

 1 #include<stdio.h>
 2 #include<string.h>
 3 char s[105];
 4 int ans[105],temp[105],temp1[105][105],a[105][105];
 5 int main()
 6 {
 7     int i,j,k,n,m;
 8     while (~scanf("%d",&m))
 9     {
10         getchar();
11         gets(s); n=strlen(s);
12         for (i=1;i<=n;i++) ans[i]=s[i-1]-'0';
13         memset(a,0,sizeof(a));
14         for (i=1;i<=n;i++)
15          if (i!=n) a[i][i]=a[i][i+1]=1;
16          else a[i][1]=a[i][n]=1;
17         while (m!=0)
18         {
19             if (m%2==1)
20             {
21                 for (j=1;j<=n;j++)
22                 {
23                  temp[j]=0;
24                  for (i=1;i<=n;i++) temp[j]=(temp[j]+ans[i]*a[i][j])%2;
25                 }
26                 for (i=1;i<=n;i++) ans[i]=temp[i];
27             }
28             m/=2;
29             {
30                 memset(temp1,0,sizeof(temp1));
31                 for (i=1;i<=n;i++)
32                  for (j=1;j<=n;j++)
33                  {
34                      for (k=1;k<=n;k++)
35                      temp1[i][j]=(temp1[i][j]+a[i][k]*a[k][j])%2;
36                  }
37                 for (i=1;i<=n;i++)
38                  for (j=1;j<=n;j++)  a[i][j]=temp1[i][j];
39             }
40         }
41         for (i=1;i<=n;i++) printf("%d",ans[i]);
42         printf("\n");
43     } 
44 }

http://acm.hdu.edu.cn/showproblem.php?pid=2276

posted on 2014-07-16 15:01  xiao_xin  阅读(101)  评论(0)    收藏  举报

导航