structMatrix { int n, m, a[kMaxN][kMaxN]; voidset(int _n, int _m){ n = _n, m = _m; } friend Matrix operator *(Matrix &a, Matrix &b) { static Matrix ret; assert(a.m == b.n); ret.set(a.n, b.m); for (int i = 1; i <= a.n; ++i) { for (int j = 1; j <= b.m; ++j) { ret.a[i][j] = 0; for (int k = 1; k <= a.m; ++k) ret.a[i][j] += a.a[i][k] * b.a[k][j]; ret.a[i][j] %= mod; } } return ret; } } a, b;
intgetdet(Matrix a){ assert(a.n == a.m); int n = a.n, ret = 1; for (int i = 1; i <= n; ++i) { if (!a.a[i][i]) { for (int j = i + 1; j <= n; ++j) { if (a.a[j][i]) { std::swap(a.a[i], a.a[j]), ret = mod - ret; break; } } } if (!a.a[i][i]) return0; ret = ret * a.a[i][i] % mod; for (int j = i + 1; j <= n; ++j) { int d = a.a[j][i] * a.a[i][i]; for (int k = i; k <= n; ++k) a.a[j][k] = (a.a[j][k] - a.a[i][k] * d + 3 * mod) % mod; } } return (ret % mod + mod) % mod; }
voiddickdreamer(){ std::cin >> taskid >> n >> m; if (taskid == 1) { mod = 3, a.set(m, n), b.set(n, m); for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) std::cin >> b.a[i][j], a.a[j][i] = b.a[i][j]; std::cout << getdet(a * b) << '\n'; } else { mod = 2, a.set(m, n), b.set(n, m); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) std::cin >> a.a[j][i]; int c; std::cin >> c; b.a[i][c] = 1; } std::cout << getdet(a * b) << '\n'; } }