显示代码纯文本
#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;
}