問題描述
試題編號: | 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;
}