#include<bits/stdc++.h>
#define lx (x<<1)
#define rx (x<<1|1)
using namespace std;
const long long MAX_N = 4*1e6+5, mod = 998244353;
typedef long long ll;
ll tr[MAX_N], fact[MAX_N], n, temp, ans1 = 1;
void data(int x){
tr[x] = (tr[lx]+tr[rx])%mod;
return;
}
void build(int x, int l, int r){
if (l==r){
tr[x] = 1;
return ;
}
int mid = (l+r)>>1;
build(lx,l,mid);
build(rx,mid+1,r);
data(x);
return;
}
ll find1(int A, int B, int l, int r, int x){
if (A>B) return 0;
if (l>=A&&r<=B) return tr[x];
int mid = (l+r)>>1;
ll ans = 0;
if (A<=mid) ans+=find1(A,B,l,mid,lx)%mod;
if (B>=mid+1) ans+=find1(A,B,mid+1,r,rx)%mod;
return ans%mod;
}
void change(int l, int r, int x, int t){
if (l==r){
tr[x] = 0;
return;
}
int mid = (l+r)>>1;
if (t<=mid) change(l,mid,lx,t);
else change(mid+1,r,rx,t);
data(x);
return;
}
int main()
{
cin >> n;
fact[1] = 1;
for (int i = 2; i <= n; i++){
fact[i] = (fact[i-1]*i)%mod;
}
build(1,1,n);
for (int i = 1; i <= n ; i++){
cin >> temp;
change(1,n,1,temp);
ans1+=((find1(1,temp-1,1,n,1)*fact[n-i]%mod)%mod);
}
cout << ans1;
return 0;
}