问题描述
试题编号: | 201512-5 |
试题名称: | 矩阵 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 创造一个世界只需要定义一个初状态和状态转移规则。 输入格式 输入第一行包含一个整数m,表示矩阵和向量的规模。 输出格式 输出n行,每行包含一个01串,表示对应询问中Akb(0)的结果。 样例输入 3 样例输出 101 评测用例规模与约定 本题使用10个评测用例来测试你的程序。 |
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=200;
int n;
struct Matrix
{
int m[maxn][maxn];
};
Matrix P;
Matrix I;
Matrix Matrixmul(Matrix a,Matrix b)
{
int i,j,k;
Matrix c;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
c.m[i][j]=0;
for(int k=0; k<n; k++)
{
c.m[i][j]^=(a.m[i][k]&b.m[k][j]);
}
}
}
return c;
}
Matrix quickpow(int n)
{
Matrix m=P,b=I;
while(n)
{
if(n&1)
{
b=Matrixmul(b,m);
}
n=n>>1;
m=Matrixmul(m,m);
}
return b;
}
int main()
{
for(int i=0; i<maxn; i++)
for(int j=0; j<maxn; j++)
if(i==j)
I.m[i][j]=1;
else
I.m[i][j]=0;
scanf("%d",&n);
getchar();
char ss[maxn];
int b[maxn];
for(int i=0; i<n; i++)
{
gets(ss);
for(int j=0; j<n; j++)
P.m[i][j]=ss[j]-'0';
}
gets(ss);
for(int j=0; j<n; j++)
b[j]=ss[j]-'0';
int t;
scanf("%d",&t);
int ans[maxn];
while(t--)
{
int c;
scanf("%d",&c);
Matrix x=quickpow(c);
for(int i=0; i<n; i++)
{
ans[i]=0;
for(int j=0; j<n; j++)
ans[i]^=(x.m[i][j]&b[j]);
}
for(int i=0; i<n; i++)
printf("%d",ans[i]);
puts("");
}
return 0;
}