#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2001;
struct Fenwick {
  vector<int> A;
  Fenwick() {}
  Fenwick(int _n) : A(_n + 1, 0) {}
  void reset() { fill(A.begin(), A.end(), 0); }
  void update(int a, int v) {
    while (a < A.size()) {
      A[a] += v;
      a += a & -a;
    }
  }
  int query(int a) {
    int ans = 0;
    while (a) {
      ans += A[a];
      a -= a & -a;
    }
    return ans;
  }
  int query(int a, int b) {
    if (a > b) return 0;
    return (query(b) - query(a - 1));
  }
};
Fenwick A, B;
int v[MAXN];
int v2[MAXN];
long long int inv[MAXN];
long long int fact[MAXN];
int mat[MAXN][MAXN];
bool vis[MAXN][MAXN];
long long int memo[MAXN][MAXN];
void reset(int id, int n) {
  A.reset();
  B.reset();
  for (int i = 0; i < n; i++) {
    v[i + 1] = (id != 0);
    v2[i + 1] = (id == 0);
    if (id)
      A.update(i + 1, 1);
    else
      B.update(i + 1, 1);
  }
}
void setOff(int a) {
  if (v[a]) A.update(a, -1);
  if (v2[a]) B.update(a, -1);
  v[a] = v2[a] = 0;
}
void changeSet(int a) {
  if (v[a]) {
    A.update(a, -1);
    B.update(a, 1);
    v[a] = 0;
    v2[a] = 1;
  }
}
long long int go(int n, int m) {
  if (vis[n][m]) return memo[n][m];
  vis[n][m] = 1;
  if (!m) return memo[n][m] = fact[n];
  return memo[n][m] = (go(n, m - 1) - go(n - 1, m - 1) + 998244353) % 998244353;
}
long long int power(long long int a, long long int b) {
  long long int ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % 998244353;
    a = a * a % 998244353;
    b >>= 1;
  }
  return ans;
}
long long int C(int n, int k) {
  return fact[n] * inv[k] % 998244353 * inv[n - k] % 998244353;
}
int solveB(int i, int j) {
  int a = mat[i][j] - 1;
  int ans = B.query(1, a);
  if (i - 1 >= 0 && a >= mat[i - 1][j] && v2[mat[i - 1][j]]) ans--;
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  fact[0] = 1;
  for (int i = 0; i < MAXN; i++) {
    if (i) fact[i] = i * fact[i - 1] % 998244353;
    inv[i] = power(fact[i], 998244353 - 2);
  }
  int n;
  cin >> n;
  long long int row = 0;
  for (int k = 0; k < n + 1; k++) {
    row += (k & 1 ? -1 : 1) * C(n, k) * fact[n - k];
    row %= 998244353;
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) cin >> mat[i][j];
  A = Fenwick(n);
  B = Fenwick(n);
  long long int ans = 0;
  for (int i = 0; i < n; i++) {
    reset(i, n);
    for (int j = 0; j < n; j++) {
      if (i - 1 >= 0) changeSet(mat[i - 1][j]);
      int a = A.query(1, n);
      long long int aux = A.query(1, mat[i][j] - 1) *
                          go(n - j - 1, max(a - 1, 0)) % 998244353 *
                          power(row, n - i - 1) % 998244353;
      aux += solveB(i, j) * go(n - j - 1, a) % 998244353 *
             power(row, n - i - 1) % 998244353;
      ans = (ans + aux) % 998244353;
      setOff(mat[i][j]);
    }
  }
  cout << ans << '\n';
  return 0;
}
