#include #include using namespace std; template T determinant(vector> a) { T det = 1; for (int j = 0, r = 0, n = a.size(); j < n; ++j, ++r) { for (int i = r + 1; i < n; ++i) if (!(a[i][j] == 0)) { swap(a[r], a[i]), det = -det; break; } if (a[r][j] == 0) return 0; det *= a[r][j]; T inv = 1 / a[r][j]; for (auto&& e : a[r]) e *= inv; for (int i = 0; i < n; ++i) if (i != r and !(a[i][j] == 0)) for (int k = n; k-- > j;) a[i][k] -= a[r][k] * a[i][j]; } return det; } using Mint = atcoder::modint998244353; istream& operator>>(istream& is, Mint& x) { int v; is >> v; x = Mint::raw(v); return is; } void Solve() { int n, m; cin >> n >> m; vector a(n, vector(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> a[i][j]; } } vector b(n, vector(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> b[i][j]; } } vector c(n, vector(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { c[i][j] = inner_product(a[i].begin(), a[i].end(), b[j].begin(), Mint(i == j)); } } cout << (determinant(c) - 1).val() << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); Solve(); }