voidsolve(){ int n = read(); using bs = bitset<205>;
vector<bs> A(n), B(n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int x = read(); if (x) A[i].set(j); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int x = read(); if (x) B[i].set(j); } }
auto rank_gf2 = [&](auto M) -> int { int r = 0; for (int c = 0; c < n and r < n; c++) { int piv = -1; for (int i = r; i < n; i++) if (M[i][c]) { piv = i; break; } if (piv == -1) continue; swap(M[r], M[piv]); for (int i = 0; i < n; i++) if (i != r and M[i][c]) M[i] ^= M[r]; ++r; } return r; };
int sum = 0; for (int j = 0; j < n; j++) { auto M = A; for (int i = 0; i < n; i++) { if (B[i][j]) M[i].flip(i); } int r = rank_gf2(M); sum += n - r; } Z ans = power(Z(2), sum); cout << ans << "\n"; }
dp[60][0][0][0] = 1; for (int i = 59; i >= 7; i--) { int w = (L >> i & 1);
for (int o : {0, 1}) { for (int l : {0, 1}) { for (int x : {0, 1}) { if (!dp[i + 1][o][l][x]) continue;
for (int y = 0; y < (o | w) + 1; y++) { int no = o | (y < w); int nl = y == 0 ? 0 : l ^ 1; int nx = x ^ y; dp[i][no][nl][nx] += dp[i + 1][o][l][x]; } } } } }
int ans = 0; for (int i = 0; i <= 127; i++) {
// high xor low = a[0] // high = a[0] xor low int d = (__builtin_popcount(i) ^ a[0]) & 1;
for (int l : {0, 1}) { int ok = 1; for (int j = 1; j < m and ok; j++) { int k = i + j; if (k & 128) k = 128 * (l ^ 1) + (k & 127); int nd = (__builtin_popcount(k) ^ a[j]) & 1; ok &= (nd == d); } if (ok) { ans += dp[7][1][l][d]; if (i <= (L & 127)) ans += dp[7][0][l][d]; } } }