constint MOD = 998244353, N = 1e6 + 5; int n, a[N], tr[N], fac[N];
voidupd(int x, int v){for (; x <= n; x += x & -x) tr[x] += v;} intqry(int x){int res = 0; for (; x; x -= x & -x) res += tr[x]; return res;} intqry(int x, int y){returnqry(y) - qry(x - 1);}
intmain(){ scanf("%d", &n); fac[0] = 1; for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * 1ll * i % MOD; for (int i = 1; i <= n; i++) scanf("%d", &a[i]), upd(a[i], 1); int res = 1; for (int i = 1; i <= n; i++) { res = (res + fac[n - i] * 1ll * qry(a[i] - 1) % MOD) % MOD; upd(a[i], -1); } printf("%d\n", res); return0; }