package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
var fact []int64
var invFact []int64
func power(base, exp int64) int64 {
res := int64(1)
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func modInverse(n int64) int64 {
return power(n, MOD-2)
}
func precompute(maxN int) {
fact = make([]int64, maxN+1)
invFact = make([]int64, maxN+1)
fact[0] = 1
invFact[0] = 1
for i := 1; i <= maxN; i++ {
fact[i] = (fact[i-1] * int64(i)) % MOD
}
invFact[maxN] = modInverse(fact[maxN])
for i := maxN - 1; i >= 1; i-- {
invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
}
}
func nCr(n, r int) int64 {
if r < 0 || r > n {
return 0
}
return fact[n] * invFact[r] % MOD * invFact[n-r] % MOD
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
if _, err := fmt.Fscan(reader, &t); err != nil {
return
}
precompute(6005)
for tc := 0; tc < t; tc++ {
var n int
fmt.Fscan(reader, &n)
p := make([]int, n+1)
sortedValid := true
for i := 1; i <= n; i++ {
fmt.Fscan(reader, &p[i])
if p[i] != -1 && p[i] != i {
sortedValid = false
}
}
totalWays := int64(0)
for k := 1; k < n; k++ {
cx, cy := 0, 0
ways := int64(1)
for i := 1; i <= n; i++ {
if p[i] == -1 {
continue
}
var px, py, nx, ny int
if p[i] <= k {
px = p[i] - 1
py = i - p[i]
nx = p[i]
ny = i - p[i]
} else {
px = i + k - p[i]
py = p[i] - k - 1
nx = i + k - p[i]
ny = p[i] - k
}
if px < cx || py < cy {
ways = 0
break
}
ways = (ways * nCr((px-cx)+(py-cy), px-cx)) % MOD
cx = nx
cy = ny
}
if ways > 0 {
nx, ny := k, n-k
if nx < cx || ny < cy {
ways = 0
} else {
ways = (ways * nCr((nx-cx)+(ny-cy), nx-cx)) % MOD
}
}
totalWays = (totalWays + ways) % MOD
}
if sortedValid {
totalWays = (totalWays - int64(n-2)%MOD + MOD) % MOD
}
fmt.Fprintln(writer, totalWays)
}
}