← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD int64 = 1000000007

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReader(os.Stdin)}
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	val := 0
	c, _ := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, _ = fs.r.ReadByte()
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int(c-'0')
		c, _ = fs.r.ReadByte()
	}
	return sign * val
}

func modPow(a, e int64) int64 {
	res := int64(1)
	for e > 0 {
		if e&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		e >>= 1
	}
	return res
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	t := in.NextInt()
	maxN := 5000
	fact := make([]int64, maxN+1)
	ifact := make([]int64, maxN+1)
	fact[0] = 1
	for i := 1; i <= maxN; i++ {
		fact[i] = fact[i-1] * int64(i) % MOD
	}
	ifact[maxN] = modPow(fact[maxN], MOD-2)
	for i := maxN; i >= 1; i-- {
		ifact[i-1] = ifact[i] * int64(i) % MOD
	}
	comb := func(n, k int) int64 {
		if k < 0 || k > n || n < 0 {
			return 0
		}
		return (((fact[n] * ifact[k]) % MOD) * ifact[n-k]) % MOD
	}

	for ; t > 0; t-- {
		n := in.NextInt()
		a := make([]int, n+1)
		isNeg := make([]bool, n+2)
		P := make([]int, 0)
		for i := 1; i <= n; i++ {
			a[i] = in.NextInt()
			if a[i] == -1 {
				isNeg[i] = true
				P = append(P, i)
			}
		}
		S := len(P)
		posOf := make([]int, n)
		for i := 0; i < n; i++ {
			posOf[i] = -1
		}
		for i := 1; i <= n; i++ {
			if a[i] != -1 {
				posOf[a[i]] = i
			}
		}
		prefixNeg := make([]int, n+1)
		for i := 1; i <= n; i++ {
			prefixNeg[i] = prefixNeg[i-1]
			if isNeg[i] {
				prefixNeg[i]++
			}
		}

		var singles int64 = 0
		w := make([]int64, 0)
		if S >= 1 {
			for _, p := range P {
				singles = (singles + int64(p)*int64(n-p+1)) % MOD
			}
			if S >= 2 {
				w = make([]int64, S-1)
				for i := 0; i < S-1; i++ {
					pi := int64(P[i])
					for j := i + 1; j < S; j++ {
						tgap := j - i - 1
						add := (pi * int64(n-P[j]+1)) % MOD
						w[tgap] += add
						if w[tgap] >= MOD {
							w[tgap] -= MOD
						}
					}
				}
			}
		}

		var ans int64 = 0
		missSmall := 0
		fCount := 0
		lF, rF := 0, 0
		stateValid := false
		var conv []int64
		aCnt, bCnt, cCnt := 0, 0, 0

		buildState := func() {
			aCnt = prefixNeg[lF-1]
			cCnt = prefixNeg[n] - prefixNeg[rF]
			if rF-1 >= lF {
				bCnt = prefixNeg[rF-1] - prefixNeg[lF]
			} else {
				bCnt = 0
			}
			Lcount := make([]int64, aCnt+1)
			x := 0
			Lcount[0]++
			for l := lF - 1; l >= 1; l-- {
				if isNeg[l] {
					x++
				}
				Lcount[x]++
			}
			Rcount := make([]int64, cCnt+1)
			y := 0
			Rcount[0]++
			for r := rF + 1; r <= n; r++ {
				if isNeg[r] {
					y++
				}
				Rcount[y]++
			}
			conv = make([]int64, aCnt+cCnt+1)
			for i := 0; i <= aCnt; i++ {
				li := Lcount[i]
				if li == 0 {
					continue
				}
				for j := 0; j <= cCnt; j++ {
					if Rcount[j] == 0 {
						continue
					}
					s := i + j
					conv[s] = (conv[s] + li*Rcount[j]) % MOD
				}
			}
			stateValid = true
		}

		for k := 0; k < n; k++ {
			stateChanged := false
			if posOf[k] != -1 {
				fCount++
				if fCount == 1 {
					lF, rF = posOf[k], posOf[k]
					stateChanged = true
				} else {
					p := posOf[k]
					if p < lF {
						lF = p
						stateChanged = true
					}
					if p > rF {
						rF = p
						stateChanged = true
					}
				}
			} else {
				missSmall++
			}
			m := missSmall
			sgt := S - m
			var U int64 = 0
			if fCount == 0 {
				if m == 1 {
					U = singles
				} else if m >= 2 {
					if S >= 2 {
						var sum int64 = 0
						for tgap := 0; tgap <= S-2; tgap++ {
							c := comb(tgap, m-2)
							if c != 0 && w[tgap] != 0 {
								sum = (sum + w[tgap]*c) % MOD
							}
						}
						U = sum
					} else {
						U = 0
					}
				} else {
					U = 0
				}
			} else {
				if stateChanged || !stateValid {
					buildState()
				}
				var sum int64 = 0
				maxs := aCnt + cCnt
				for s := 0; s <= maxs; s++ {
					if conv[s] == 0 {
						continue
					}
					c := comb(bCnt+s, m)
					if c != 0 {
						sum = (sum + conv[s]*c) % MOD
					}
				}
				U = sum
			}
			U = U * fact[m] % MOD
			if sgt >= 0 {
				U = U * fact[sgt] % MOD
			} else {
				U = 0
			}
			ans += U
			if ans >= MOD {
				ans -= MOD
			}
		}
		if ans < 0 {
			ans += MOD
		}
		fmt.Fprintln(out, ans%MOD)
	}
}