#include #include #include #include #include #include #include #include #include using namespace std; const int N = 30; const double eps = 10e-8; int n; int start[N]; //开始状态 int stop[N]; //结束状态 //高斯消元模板 double a[N][N]; //增广矩阵 int gauss() { int c, r; //当前列,行 // 1、枚举系数每一列 for (c = 0, r = 0; c < n; c++) { // 2、找出系数最大的行 int t = r; for (int i = r; i < n; i++) //行 if (abs(a[i][c]) > abs(a[t][c])) t = i; // 3、最大系数为0,直接下一列 if (abs(a[t][c]) < eps) continue; // 4、交换 if (r != t) // POJ中,如果二维数组,直接swap(a[t],a[r])会报编译错误,没办法,只好用了循环 for (int i = 0; i < N; i++) swap(a[t][i], a[r][i]); // 5、倒序, 每项除a[r][c],化系数为1,处理的是方程左右两端,需要带着a[r][n] for (int i = n; i >= c; i--) a[r][i] /= a[r][c]; // 6、用当前行将下面所有的列消成0 for (int i = r + 1; i < n; i++) for (int j = n; j >= c; j--) a[i][j] -= a[r][j] * a[i][c]; // 7、下一行 r++; } if (r < n) { for (int i = r; i < n; i++) if (abs(a[i][n]) > eps) return -1; //无解 return n - r; //自由元个数 } //倒三角,将已知解代入 for (int i = n - 2; i >= 0; i--) for (int j = i + 1; j < n; j++) a[i][n] -= a[i][j] * a[j][n]; //唯一解:0 return 0; } int main() { int T; cin >> T; while (T--) { cin >> n; memset(a, 0, sizeof(a)); memset(start, 0, sizeof(start)); //初始化开始状态 memset(stop, 0, sizeof(stop)); //初始化终止状态 //输入起始状态(下标从0开始) for (int i = 0; i < n; i++) cin >> start[i]; //输入终止状态(下标从0开始) for (int i = 0; i < n; i++) cin >> stop[i]; //输入增广矩阵 int x, y; while (cin >> x >> y && x != 0 && y != 0) a[y - 1][x - 1] = 1; //反着存入y-1受x-1影响 for (int i = 0; i < n; i++) { a[i][n] = start[i] ^ stop[i]; //状态变化 start^stop a[i][i] = 1; //自己影响自己 } //高斯消元模板 int t = gauss(); if (t == -1) cout << "Oh,it's impossible~!!" << endl; else cout << (1 << t) << endl; } return 0; }