← Home
For problem statement at 2000-2999/2100-2199/2150-2159/2159/problemC.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2150-2159/2159/verifierC.go ends with deterministic case 1 failed: expected "1\n1\n3\n2\n0\n3" got "2\n1\n4\n2\n0\n2"
input:
6
1
-1 -1
2
-1 2 -1
2
-1 -1 -1
3
-1 -1 3 -1
3
-1 2 3 -1
5
-1 -1 -1 1 0 -1 can you fix the verifier? ```go
package main

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

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
	}

	for tc := 0; tc < t; tc++ {
		var n int
		fmt.Fscan(reader, &n)
		A := make([]int, n+1)
		for i := 0; i <= n; i++ {
			fmt.Fscan(reader, &A[i])
		}

		S_req := make([]int, 0)
		sumSReq := 0
		M := make(map[int]bool)
		possible := true

		for i := 1; i <= n; i++ {
			if A[i] == 0 {
				S_req = append(S_req, i)
				sumSReq += i
			} else if A[i] > 0 {
				j := A[i]
				if A[j] != -1 && A[j] != i {
					possible = false
				}
				M[i] = true
				M[j] = true
			}
		}

		if !possible {
			fmt.Fprintln(writer, 0)
			continue
		}

		for _, i := range S_req {
			if M[i] {
				possible = false
			}
		}

		if !possible {
			fmt.Fprintln(writer, 0)
			continue
		}

		MaxV := n - sumSReq
		if MaxV < 0 {
			fmt.Fprintln(writer, 0)
			continue
		}

		Free := make([]int, 0)
		for i := 1; i <= n; i++ {
			if A[i] != 0 && !M[i] {
				Free = append(Free, i)
			}
		}

		B := make([]int, 0)
		for i := 1; i <= n; i++ {
			if A[i] == 0 || M[i] {
				B = append(B, i)
			}
		}

		K := 0
		for K*K <= 2*MaxV {
			K++
		}
		if K > len(Free) {
			K = len(Free)
		}

		dp := make([][]int, K+1)
		for i := 0; i <= K; i++ {
			dp[i] = make([]int, MaxV+1)
		}
		dp[0][0] = 1

		MOD := 1000000007

		if len(Free) <= len(B) {
			for _, u := range Free {
				if u > MaxV {
					continue
				}
				for i := K; i >= 1; i-- {
					for j := MaxV; j >= u; j-- {
						dp[i][j] = (dp[i][j] + dp[i-1][j-u]) % MOD
					}
				}
			}
		} else {
			for i := 1; i <= K; i++ {
				for j := i; j <= MaxV; j++ {
					dp[i][j] = (dp[i][j-i] + dp[i-1][j-i]) % MOD
				}
			}
			for _, u := range B {
				if u > MaxV {
					continue
				}
				for i := 1; i <= K; i++ {
					for j := u; j <= MaxV; j++ {
						dp[i][j] = (dp[i][j] - dp[i-1][j-u] + MOD) % MOD
					}
				}
			}
		}

		invs := make([]int, n+1)
		invs[0] = 1
		if n >= 1 {
			invs[1] = 1
		}
		for i := 2; i <= n; i++ {
			invs[i] = (invs[i-1] + (i-1)*invs[i-2]) % MOD
		}

		ans := 0
		for c := 0; c <= K; c++ {
			sumWays := 0
			for v := 0; v <= MaxV; v++ {
				sumWays = (sumWays + dp[c][v]) % MOD
			}
			rem := len(Free) - c
			if rem >= 0 && rem <= n {
				ans = (ans + sumWays*invs[rem]) % MOD
			}
		}

		fmt.Fprintln(writer, ans)
	}
}
```