poj 1977
矩阵连乘
注意:for(i=1;i<=n;i++) map[i][i]=1;
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n;
long long m;
char c[101][101][22];
char c1[101][22];
int num[101];
int a[101];
int map[101][101],map1[101][101],map2[101][101];
void solve(long long s){
int i,j,k;
if(s==1)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map1[i][j]=map[i][j];
return;
}
solve(s/2);
if(s/2*2==s)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int s=0;
for(k=1;k<=n;k++)
s+=map1[i][k]*map1[k][j];
map2[i][j]=s%2;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map1[i][j]=map2[i][j];
}
else
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int s=0;
for(k=1;k<=n;k++)
s+=map1[i][k]*map1[k][j];
map2[i][j]=s%2;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int s=0;
for(k=1;k<=n;k++)
s+=map2[i][k]*map[k][j];
map1[i][j]=s%2;
}
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int cas;
cin>>cas;
while(cas--)
{
cin>>n>>m;
m--;
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
cin>>c1[i]>>a[i]>>num[i];
a[i]%=2;
for(j=1;j<=num[i];j++)
cin>>c[i][j];
}
for(i=1;i<=n;i++)
map[i][i]=1;
for(i=1;i<=n;i++)
for(j=1;j<=num[i];j++)
{
for(k=1;k<=n;k++)
if(strcmp(c[i][j],c1[k])==0)
break;
map[k][i]=(map[k][i]+1)%2;
}
solve(m);
int ans=0;
for(i=1;i<=n;i++)
{
int s=0;
for(j=1;j<=n;j++)
s+=map1[i][j]*a[j];
if(s%2) ans++;
}
cout<<ans<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号