#include <bits/stdc++.h>
const int N = 300032;
const long long MOD = 998244353;
long long factor(int n) {
  long long s = 1;
  while (n > 2) s = s * n-- % MOD;
  return s;
}
struct range {
  int l, r;
  range() {}
  range(int l, int r) : l(l), r(r) {}
  int len();
} rg[N];
int a[N], n, len, fre = 0;
long long ans = 1;
inline int nxt(int i) {
  if (++i >= n) i -= n;
  return i;
}
inline int pre(int i) {
  if (--i < 0) i += n;
  return i;
}
inline int range::len() {
  int d = r - l + 1;
  if (d <= 0) d += n;
  return d;
}
inline void ins(range x) {
  bool hl = a[pre(x.l)] < a[x.l], hr = a[nxt(x.r)] < a[x.r];
  if (hl && hr) ans = ans * (len + 1 - x.len()) % MOD;
  if (hl) {
    if (hr)
      fre += len + x.len() - 2;
    else
      fre += x.len() - 1;
  } else {
    if (hr) fre += x.len() - 1;
  }
}
int main() {
  memset(rg, -1, sizeof rg);
  scanf("%d", &n);
  int l = 0;
  for (int i = 0; i < n; i++) {
    scanf("%d", a + i);
    if (i && a[i] != a[i - 1]) {
      auto &t = rg[a[i - 1]];
      if (~t.r) {
        puts("0");
        return 0;
      }
      t = range(l, i - 1), l = i;
    }
  }
  if (!l) {
    printf("%lld\n", factor(n));
    return 0;
  }
  a[n] = a[0];
  if (a[n - 1] == a[0])
    rg[a[0]].l = l;
  else {
    auto &t = rg[a[n - 1]];
    if (~t.r) {
      puts("0");
      return 0;
    } else
      t = range(l, n - 1);
  }
  if (rg[1].r == -1) {
    puts("0");
    return 0;
  }
  len = rg[1].len();
  for (int i = 1; i <= n; i++)
    if (~rg[i].r) {
      ins(rg[i]);
      if (rg[i].len() > len) {
        puts("0");
        return 0;
      }
    } else
      ans = ans * fre-- % MOD;
  printf("%lld\n", ans);
  return 0;
}
