#define x first #define y second #define x1 X1 #define x2 X2 #define y1 Y1 #define y2 Y2 #define mp make_pair #define pb push_back
usingnamespacestd;
typedeflonglong LL; typedef pair<int, int> pii;
template <typename T> inlineintChkmax(T &a, T b){ return a < b ? a = b, 1 : 0; } template <typename T> inlineintChkmin(T &a, T b){ return a > b ? a = b, 1 : 0; } inlineintread() { int sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) + ch - '0'; return sum * fl; }
constint Maxn = 3e5 + 100, Mod = 998244353;
int N, A[Maxn];
namespace BIT { #define lowbit(x) (x & (-x)) int sum[Maxn]; inlinevoidadd(int x, int val){ while (x <= N) { sum[x] += val; x += lowbit(x); } } inlineintquery(int x){ int ans = 0; while (x) { ans += sum[x]; x -= lowbit(x); } return ans; } }
inlinevoidAdd(int &x, int y){ x += y; x -= x >= Mod ? Mod : 0; }
int fac[Maxn], Sum[Maxn], Vis[Maxn];
intmain() { #ifndef ONLINE_JUDGE freopen("c.in", "r", stdin); freopen("c.out", "w", stdout); #endif N = read(); int cnt = 0, sum = 0; fac[0] = 1; for (int i = 1; i <= N; ++i) fac[i] = 1ll * fac[i - 1] * i % Mod; for (int i = 1; i <= N; ++i) A[i] = read(), cnt += !A[i], Vis[A[i]] = 1; for (int i = 1; i <= N; ++i) Sum[i] = Sum[i - 1] + !Vis[i], Add(sum, (!Vis[i] ? (i - 1) : 0)); int ans = fac[cnt], tot1 = 0, tot2 = 0; for (int i = 1; i <= N; ++i) { int tmp = 0; if (A[i]) { Add (tmp, 1ll * (A[i] - 1) * fac[cnt] % Mod); if (cnt) Add (tmp, Mod - (1ll * tot1 * Sum[A[i] - 1] % Mod * fac[cnt - 1] % Mod)); Add (tmp, Mod - (1ll * BIT :: query (A[i] - 1) * fac[cnt] % Mod)); Add (tot2, (cnt - Sum[A[i]])); BIT :: add (A[i], 1); } else { Add (tmp, 1ll * sum * fac[cnt - 1] % Mod); /**/if (cnt > 1) Add (tmp, Mod - (1ll * cnt * (cnt - 1) / 2 % Mod * tot1 % Mod * fac[cnt - 2] % Mod)); if (cnt) Add (tmp, Mod - (1ll * tot2 * fac[cnt - 1] % Mod)); ++tot1; } Add (ans, 1ll * tmp * fac[N - i] % Mod); } cout<<ans<<endl; return0; }