import sys
input = sys.stdin.readline

mod=998244353

FACT=[1]
for i in range(1,4*10**5+1):
    FACT.append(FACT[-1]*i%mod)

FACT_INV=[pow(FACT[-1],mod-2,mod)]
for i in range(4*10**5,0,-1):
    FACT_INV.append(FACT_INV[-1]*i%mod)

FACT_INV.reverse()

def Combi(a,b):
    if 0<=b<=a:
        return FACT[a]*FACT_INV[b]%mod*FACT_INV[a-b]%mod
    else:
        return 0


N=int(input())
P=list(map(int,input().split()))

LEN=N
BIT=[0]*(LEN+1) # 1-indexedなtree. 配列BITの長さはLEN+1にしていることに注意。

def update(v,w): # index vにwを加える
    while v<=LEN:
        BIT[v]+=w
        v+=(v&(-v)) # v&(-v)で、最も下の立っているビット. 自分を含む大きなノードへ. たとえばv=3→v=4

def getvalue(v): # [1,v]の区間の和を求める
    ANS=0
    while v!=0:
        ANS+=BIT[v]
        v-=(v&(-v)) # 自分より小さい自分の和を構成するノードへ. たとえばv=14→v=12へ
    return ANS

    
INV=[-1]*N
for i in range(N):
    INV[P[i]-1]=i

ANS=0
for i in range(N):
    x=INV[i]
    A=getvalue(x)
    B=x-A
    C=i-A
    D=N-A-B-C-1

    #print(i,A,B,C,D)

    ANS+=Combi(A+D,A)*Combi(B+C,B)%mod
    ANS%=mod


    update(x+1,1)

print(ANS)