// 想定 WA #include "atcoder/modint.hpp" #include "bits/stdc++.h" using mint = atcoder::modint998244353; int main() { int n; std::cin >> n; assert(1 <= n and n <= 3000); std::vector A(n); for (int i = 0; i < n; i++) { std::cin >> A[i]; assert(1 <= A[i] and A[i] <= n); A[i]--; } std::vector n_pos; for (int i = 0; i < n; i++) { if (A[i] == n - 1) n_pos.push_back(i); } if (n_pos.empty()) { std::cout << 0 << std::endl; return 0; } if (n_pos.size() == n) { mint ans = 1; for (int i = 1; i <= n; i++) { ans *= i; } std::cout << ans.val() << std::endl; return 0; } std::vector mi(n, n); std::vector mi_cnt(n, 0); std::vector ac(n, 0); for (int i = 0; i < n; i++) { int a = A[i]; ac[a]++; for (auto d : n_pos) { int p = (i + n - d) % n; if (a < mi[p]) { mi[p] = a; mi_cnt[p] = 1; } else if (a == mi[p]) { mi_cnt[p]++; } } } std::vector cnt(n, 0); std::vector cnt2(n, 0); for (int i = 0; i < n; i++) { cnt[mi[i]]++; if (mi_cnt[i] == ac[mi[i]]) { cnt2[mi[i]]++; } } mint ans = 1; int tot = 0; for (int i = n - 1; i >= 0; i--) { tot += cnt[i]; if (ac[i] > 0) { ans *= cnt2[i]; } else { ans *= tot; } tot--; } ans *= n; std::cout << ans.val() << std::endl; }