中文题目,就不说题目大意了
解题思路:
由于对于每一个开关最多改变一次,那么对于每一个开关,只有改变与不改变两种操作,设改变操作为1,不改变操作为0,那么对开关的操作可以用一个n维向量
x⃗ T=(x1,x2,⋯,xn)
,其中
xi=0
或者
1
。
我们需要知道初始状态经过某次操作之后的状态,并拿它与目标状态比较。我们知道,对于开关
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int ab[50][50], st[50], en[50];
inline int gauss(int n)
{
int i = 0, j = 0, k;
while (j < n)
{
int id = i;
for (k = i + 1; k < n; k++)
if (abs(ab[k][j]) > abs(ab[id][j]))
id = k;
if (id != i)
{
for (k = j; k <= n; k++)
swap(ab[i][k], ab[id][k]);
}
if (ab[i][j] == 0) { j++; continue; }
for (k = i + 1; k < n; k++)
{
if (ab[k][j] == 0) continue;
for (int l = j; l <= n; l++)
ab[k][l] = ab[k][l] ^ ab[i][l];
}
i++, j++;
}
for (int k = i; k < n; k++)
if (ab[k][n] != 0) return -1;
return 1 << (n - i);
}
int main()
{
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> st[i];
for (int i = 0; i < n; i++) cin >> en[i];
memset(ab, 0, sizeof(ab));
for (int i = 0; i < n; i++)
ab[i][i] = 1, ab[i][n] = st[i] ^ en[i];
int I, J;
cin >> I >> J;
while (I)
{
ab[J - 1][I - 1] = 1;
cin >> I >> J;
}
int ans = gauss(n);
if (ans == -1) cout << "Oh,it's impossible~!!\n";
else cout << ans << endl;
}
return 0;
}