矩阵乘法索引: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;
}
浙公网安备 33010602011771号