写过才发现与实数的线性方程组不同,但不过更为容易,且不用考虑精度等问题。
该类算法的应用在于一系列开关问题等等经典模型。
Code : (未回代求解)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define maxn 35
int n, m, k;
int a[maxn], b[maxn];
void swap(int & a, int & b)
{
int c = a; a = b; b = c;
}
int calc()
{
int j = 1, k, ans = 0;
for (int i = 1; i <= n; ++ i)
{
for (k = j; k <= n && ! ((a[k] >> i) & 1); ++ k);
if (k <= n)
{
swap(a[k], a[j]);
for (k = j + 1; k <= n; ++ k)
if ((a[k] >> i) & 1) a[k] ^= a[j];
++ j;
}
else ++ ans;
}
for (int i = 1; i <= n; ++ i)
if (a[i] == 1) return - 1;
return 1 << ans;
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
for (scanf("%d", & k); k --; )
{
scanf("%d", & n), memset(a, 0, sizeof a);
for (int i = 1; i <= n; ++ i) scanf("%d", b + i), a[i] |= 1 << i;
for (int i = 1; i <= n; ++ i) scanf("%d", & m), a[i] |= m != b[i];
for (int i, j; scanf("%d%d", & i, & j), i && j; ) a[j] |= 1 << i;
if (~ (m = calc())) printf("%d\n", m);
else puts("Oh,it's impossible~!!");
}
return 0;
}