记录编号 183349 评测结果 AAAAAAAAAA
题目名称 [NOI 1996]三角形灯塔 最终得分 100
用户昵称 Gravatar张灵犀不和我一般见识真可怕呢(笑 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2015-08-31 08:58:08 内存使用 0.36 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
int N;
LL pow1[60]={0};
int gs[60][60]={0};
bool sure[60]={0};
LL ans=1;
int tot=0;
LL s[60][60]={0};
void check_gs()
{
	for(int i=1;i<=tot;i++)
	{
		for(int j=0;j<=N;j++)
			cout<<gs[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
}
void make_s()
{
	for(int i=1;i<=N;i++) s[N][i]=pow1[i-1];
	for(int i=N-1;i>=1;i--)
		for(int j=1;j<=N;j++)
			s[i][j]=s[i+1][j]^s[i+1][j+1];
}
void Swap(int i,int k)
{
	int t;
	for(int j=0;j<=N;j++)
	{
		t=gs[i][j];
		gs[i][j]=gs[k][j];
		gs[k][j]=t;
	}
}
bool GS()
{
	int now=0;//当前消到了几
	for(int i=1;i<=tot;i++)
	{
		int t=0;
		for(int j=now+1;j<=N;j++)
		{
			for(int k=i;k<=tot;k++)
			{
				if(gs[k][j]) {t=k;break;}
			}
			if(t) {now=j;break;}
		}
		if(t==0&&gs[i][0]) return 0;
		Swap(i,t);
		//cout<<i<<" "<<t<<endl;
		for(int j=1;j<=tot;j++)
		{
			if(!gs[j][now]||j==i) continue;
			for(int k=0;k<=N;k++)
				gs[j][k]^=gs[i][k];
			//cout<<now<<" "<<j<<endl;
		}
		//check_gs();
	}
	//check_gs();
	int tem;
	for(int i=1;i<=tot;i++)
	{
		tem=0;
		for(int j=1;j<=N;j++)
		{
			if(gs[i][j]&&!sure[j]) {tem++;sure[j]=1;}
		}
		if(gs[i][0]&&!tem) return 0;
		ans*=pow1[tem-1];
		//cout<<i<<" "<<ans<<endl;
	}
	tem=0;
	for(int i=1;i<=N;i++)
		if(!sure[i]) tem++;
	ans*=pow1[tem];
	return 1;
}
int main()
{
	freopen("lighthouse.in","r",stdin);
	freopen("lighthouse.out","w",stdout);
	scanf("%d",&N);
	pow1[0]=1;
	for(int i=1;i<=N;i++) pow1[i]=2*pow1[i-1];
	int a,b,c;
	make_s();
	while(true)
	{
		scanf("%d%d%d",&a,&b,&c);
		if(!(a||b||c)) break;
		tot++;
		LL t=s[a][b];
		//cout<<t<<endl;
		for(LL i=1,k=1;k<=t;k<<=1,i++)
			if(t&k) gs[tot][i]=1;
		gs[tot][0]=c;
			//cout<<a<<" "<<b<<" "<<c<<endl;
    }
	//check_gs();
	if(!GS()) printf("No Answer!");
	else printf("%d\n",ans);
	//check_gs();
	return 0;
}