#include <bits/stdc++.h>
using namespace std;
int sumv1[2005], sumv2[2005];
void add(int *sumv, int x, int num, int n) {
  for (; x <= n; x += (x & -x)) sumv[x] += num;
}
int sum(int *sumv, int x) {
  int s = 0;
  for (; x; x -= (x & -x)) s += sumv[x];
  return s;
}
long long f[2005][2005], g[2005];
void pre(int n) {
  f[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    f[i][0] = f[i - 1][0] * i % 998244353;
    for (int j = 1; j <= i; j++)
      f[i][j] = (f[i][j - 1] - f[i - 1][j - 1] + 998244353) % 998244353;
  }
  g[0] = 1;
  for (int i = 1; i <= n; i++) g[i] = g[i - 1] * f[n][n] % 998244353;
}
int num[2005][2005];
bool vis[2005], vis2[2005];
long long solve(int d, int n) {
  memset(vis, 0, sizeof(vis));
  memset(vis2, 0, sizeof(vis2));
  memset(sumv1, 0, sizeof(sumv1));
  memset(sumv2, 0, sizeof(sumv2));
  for (int i = 1; i <= n; i++) {
    add(sumv1, i, 1, n);
    add(sumv2, i, 1, n);
  }
  long long ans = 0;
  int cnt = n;
  for (int i = 1; i <= n; i++) {
    if (d != 1 && !vis[num[d - 1][i]]) {
      vis[num[d - 1][i]] = 1;
      add(sumv2, num[d - 1][i], -1, n);
      cnt--;
    }
    if (d != 1) {
      int s1 = sum(sumv2, num[d][i] - 1), s2 = sum(sumv1, num[d][i] - 1) - s1;
      if (num[d - 1][i] < num[d][i] && !vis2[num[d - 1][i]]) s2--;
      ans = (ans + s1 * f[n - i][cnt - 1] + s2 * f[n - i][cnt]) % 998244353;
    } else
      ans = (ans + sum(sumv1, num[d][i] - 1) * f[n - i][0]) % 998244353;
    add(sumv1, num[d][i], -1, n);
    vis2[num[d][i]] = 1;
    if (d != 1 && !vis[num[d][i]]) {
      vis[num[d][i]] = 1;
      add(sumv2, num[d][i], -1, n);
      cnt--;
    }
  }
  return ans;
}
int main() {
  int n;
  scanf("%d", &n);
  pre(n);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) scanf("%d", &num[i][j]);
  long long ans = 0;
  for (int i = 1; i <= n; i++) ans = (ans + solve(i, n) * g[n - i]) % 998244353;
  printf("%lld\n", ans);
  return 0;
}
