#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 600010
#define M 998244353
int n,ans,vis[N],p[N],a[N];
int dp[19][2][2][2][524290];
inline int read(){
char ch=getchar(); int x=0,f=1;
for (;ch>'9'||ch<'0';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
}
int dfs(int x,bool flag,bool flag1,bool flag2,int P){
for (int i=1;i<x;i++) {
if (p[i]>i) for (int j=i+1;j<=min(p[i],x-1);j++) if (p[j]>p[i]) flag1=0;
if (p[i]==i) for (int j=i+1;j<x;j++) if (p[j]<p[i]) return 0;
}
if (!flag1 && !flag2) return 0;
if (x==n+1 && flag && (flag1 || flag2)){
// ans++;
// for (int i=1;i<=n;i++) printf("%d ",p[i]);
// puts("");
return 1;
}
if (dp[x][flag][flag1][flag2][P]!=-1) return dp[x][flag][flag1][flag2][P];
int &res=dp[x][flag][flag1][flag2][P]; res=0;
if (!flag){
for (int i=a[x];i<=n;i++){
if (vis[i]) continue;
if (i>x){
vis[i]=1;
p[x]=i;
(res+=dfs(x+1,i!=a[x],flag1,flag2,P|(1<<i-1)))%=M;
vis[i]=0;
}else if (i<x){
bool f=0;
for (int j=i;j<x;j++) if (p[j]<i) {f=1; break;}
// if (f) continue;
vis[i]=1; p[x]=i;
(res+=dfs(x+1,i!=a[x],flag1,!f,P|(1<<i-1)))%=M;
vis[i]=0;
}else if (i==x){
bool f=0;
for (int j=1;j<x;j++) if (p[j]>i){f=1; break;}
if (f) continue;
vis[i]=1; p[x]=i;
(res+=dfs(x+1,i!=a[x],flag1,flag2,P|(1<<i-1)))%=M;
vis[i]=0;
}
}
return res;
}
for (int i=1;i<=n;i++){
if (vis[i]) continue;
if (i>=x){
vis[i]=1;
p[x]=i;
(res+=dfs(x+1,1,flag1,flag2,P|(1<<i-1)))%=M;
vis[i]=0;
}else if (i<x){
bool f=0;
for (int j=i;j<x;j++) if (p[j]<i) {f=1; break;}
// if (f) continue;
vis[i]=1; p[x]=i;
(res+=dfs(x+1,1,flag1,!f,P|(1<<i-1)))%=M;
vis[i]=0;
}else if (i==x){
bool f=0;
for (int j=1;j<x;j++) if (p[j]>i){f=1; break;}
if (f) continue;
vis[i]=1; p[x]=i;
(res+=dfs(x+1,1,flag1,flag2,P|(1<<i-1)))%=M;
vis[i]=0;
}
}
return res;
}
int main(){
int T=read();
while (T--){
memset(dp,-1,sizeof(dp));
n=read();
for (int i=1;i<=n;i++) a[i]=read();
ans=dfs(1,0,1,1,0);
printf("%d\n",ans);
}
return 0;
}