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;
}

posted on 2011-05-12 18:20  宇宙吾心  阅读(264)  评论(0)    收藏  举报

导航