record
#include <iostream>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
const int N=1e6+10,mod=998244353;
namespace Segment_tree{
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
struct node{long long value,tag;node(){value=0,tag=0;}};
node segment_tree[N*4];
void push_up(int p){segment_tree[p].value=(segment_tree[ls].value+segment_tree[rs].value)%mod;}
void push_down(int l,int r,int p){
if(!segment_tree[p].tag) return;
segment_tree[ls].value=(segment_tree[ls].value+(mid-l+1)*segment_tree[p].tag%mod)%mod;
segment_tree[rs].value=(segment_tree[rs].value+(r-mid)*segment_tree[p].tag%mod)%mod;
segment_tree[ls].tag=(segment_tree[ls].tag+segment_tree[p].tag)%mod;
segment_tree[rs].tag=(segment_tree[rs].tag+segment_tree[p].tag)%mod;
segment_tree[p].tag=0;
}
void update(int lt,int rt,int l,int r,int p,int k){
if(lt<=l&&r<=rt) return segment_tree[p].value=(segment_tree[p].value+k*(r-l+1)%mod)%mod,segment_tree[p].tag=(segment_tree[p].tag+k)%mod,void();
push_down(l,r,p);
if(lt<=mid) update(lt,rt,l,mid,ls,k);
if(rt>mid) update(lt,rt,mid+1,r,rs,k);
push_up(p);
}
int query(int lt,int rt,int l,int r,int p){
if(lt<=l&&r<=rt) return segment_tree[p].value%mod;
push_down(l,r,p);
long long sum=0;
if(lt<=mid) sum=query(lt,rt,l,mid,ls)%mod;
if(rt>mid) sum=(sum+query(lt,rt,mid+1,r,rs)%mod)%mod;
return sum%mod;
}
}
using namespace Segment_tree;
int n,a[N];
long long fac[N],ans;
signed main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
update(a[i],a[i],1,n,1,1);
}
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
for(int i=1;i<n;i++){
update(a[i],a[i],1,n,1,-1);
if(a[i]>1)ans=(ans+query(1,a[i]-1,1,n,1)*fac[n-i])%mod;
}
write(ans+1);
return 0;
}