import sys input = sys.stdin.readline mod=998244353 F=[1] for i in range(1,5050): F.append(F[-1]*i%mod) T=int(input()) for tests in range(T): n=int(input()) A=list(map(int,input().split())) KO=[0]*n for i in range(n): if A[i]!=-1: A[i]-=1 else: KO[i]+=1 MAX=0 flag=1 for i in range(n-1): if A[i]!=-1 and A[i+1]!=-1: x=min(A[i],A[i+1]) if MAX<=x: MAX=x else: flag=0 break if flag==0: print(0) continue MINLIST=[1<<30]*(n+1) for i in range(n-2,-1,-1): MINLIST[i]=min(MINLIST[i],MINLIST[i+1]) if A[i]!=-1: MINLIST[i]=min(MINLIST[i],A[i]) USE=[0]*n for a in A: if a!=-1: USE[a]=1 LIST=[] for i in range(n): if USE[i]==0: LIST.append(i) if LIST==[]: print(1) continue DP1=[[0]*n for i in range(n+1)] DP2=[[0]*n for i in range(n+1)] DP1[0][0]=1 # DP[i][j]で、index i-1まで見て、使っていない個数がj個 # DP1は、iやi+1のどちらかに置く # DP2は、iに必ず置く for i in range(n): for j in range(i,-1,-1): now=DP2[i][j] if now!=0: #if j>=1: # DP2[i][j-1]+=now*j # DP2[i][j-1]%=mod if KO[i]-j-1=1: DP1[i][j-1]+=now*j DP1[i][j-1]%=mod if KO[i]-j-1nec: DP2[i+1][j]+=now DP2[i+1][j]%=mod else: DP1[i+1][j]+=now DP1[i+1][j]%=mod ANS=0 for i in range(n): dp=DP1[n][i] ANS+=dp*F[i]%mod ANS%=mod print(ANS)