雨へ痕
下一站路口,未知的道路

矩阵乘法索引:http://blog.csdn.net/q3498233/archive/2010/08/03/5786180.aspx

题目大意:有n盏灯,0表示不亮,1表示亮,如果 i-th的灯的左边灯是亮的,那么下一秒钟,i-th灯的状态要改变,0变成1,1变成0。问你在第t秒时,灯的状态时什么样的,输出来。

解题思路:

a1 = (a1+an)%2,a2 = (a1+a2)%2,a3 = (a2+a3)%2,……an = (an+an-1)%2

然后就可以构造出矩阵了,根据上面的等式

例如: 
10 
100000001 
初始表 
1 0 0 0 0 0 0 0 1 
1 1 0 0 0 0 0 0 0 
0 1 1 0 0 0 0 0 0 
0 0 1 1 0 0 0 0 0 
0 0 0 1 1 0 0 0 0 
0 0 0 0 1 1 0 0 0 
0 0 0 0 0 1 1 0 0 
0 0 0 0 0 0 1 1 0 
0 0 0 0 0 0 0 1 1 
输入表 
1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 
矩阵为   初始表^n * 输入表,每一个元素的值为乘积值mod 2 (其实是由你怎么构这个矩阵决定的。。。)

#include <stdio.h>
#include
<string.h>
#define SIZE 101
typedef
struct matr{
int a[SIZE][SIZE];
int top;
}mat;

mat m1,m2,m3,unit;
int m2top;
void init_m1(int k)
{
int i,j;
m1.top
=m2.top=unit.top=k;
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
unit.a[i][j]
=(i==j);
if(j%k==i || j%k==(i-1+k)%k) m1.a[i][j]=1;
else m1.a[i][j]=0;
}
}
}

mat matmul(mat p,mat q)
{
mat c;
int i,j,k;
c.top
=p.top;
for (i=0;i<c.top;i++)
{
for (j=0;j<c.top;j++)
{
c.a[i][j]
= 0;
for (k=0;k<c.top;k++)
c.a[i][j]
+=p.a[i][k]*q.a[k][j];
c.a[i][j]
%=2;
}
}
return c;
}

mat matmop(
int t,mat m)
{
mat mm
=unit;
if(t>0)
while(1)
{
if(t&1)
{
mm
=matmul(mm,m);
}
t
>>=1;
if(!t) break;
m
=matmul(m,m);
}
return mm;
}

int main()
{
int t;
int i,j;
char temp[1000];
while((scanf("%d",&t))!=EOF)
{
scanf(
"%s",temp);
m2top
=strlen(temp);
for(i=0;i<m2top;i++)
{
m2.a[i][
0]=temp[i]-'0';
for(j=1;j<m2top;j++) m2.a[i][j]=0;
}
init_m1(m2top);
m1
=matmop(t,m1);
m3
=matmul(m1,m2);
for(i=0;i<m3.top;i++) printf("%d",m3.a[i][0]);
puts(
"");
}
return 0;
}
posted on 2011-03-25 23:15  雨^痕  阅读(277)  评论(0)    收藏  举报