将初状态和莫状态进行异或,结果就是所要求的目标了。
解的个数为 自由元的个数t 1<<t;
#include <iostream>
using namespace std;
int a[30],b[30],map[30][30];
int equ,var;
int gauss()
{
int h=0,col=0;
for(;h<equ&&col<var;col++)
{
int k=h;
for(;k<equ;k++)
if(map[k][col])
break;
if(map[k][col])
{
for(int r=0;r<=var;r++)
swap(map[h][r],map[k][r]);
for(int i=0;i<equ;i++)
if(i!=h&&map[i][col])
for(int k=0;k<=var;k++)
map[i][k]^=map[h][k];
h++;
}
}
for(int i=h;i<equ;i++)
if(map[i][col]!=0)
return -1;
if(h<var)
return var-h;
return 0;
}
int main()
{
int cas;
cin>>cas;
while(cas--)
{
int n;
cin>>n;
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
for(int i=0;i<n;i++)
map[i][i]=1;
equ=var=n;
int aa,bb;
while(cin>>aa>>bb&&aa&&bb)
map[bb-1][aa-1]=1; //方向别弄错了。
for(int i=0;i<n;i++)
map[i][n]=a[i]^b[i]; //将初末状态异或。
int t=gauss();
if(t==-1)
cout<<"Oh,it's impossible~!!\n";
else
cout<< (1<<t) <<endl;
}
}