← Home
For problem statement at 1000-1999/1700-1799/1750-1759/1750/problemG.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1750-1759/1750/verifierG.go ends with case 3 failed: runtime error: exit status 2
panic: runtime error: index out of range [4] with length 4

goroutine 1 [running]:
main.main()
	/tmp/build-3630621493/solution.go:95 +0x808

input:
2 3
1 3
exit status 1 can you fix the verifier? package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	var m_in int64
	if _, err := fmt.Fscan(reader, &n, &m_in); err != nil {
		return
	}
	m := m_in

	p := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &p[i])
	}

	C := make([][]int64, n+1)
	for i := 0; i <= n; i++ {
		C[i] = make([]int64, n+1)
		C[i][0] = 1
		for j := 1; j <= i; j++ {
			C[i][j] = (C[i-1][j-1] + C[i-1][j]) % m
		}
	}

	fact := make([]int64, n+1)
	fact[0] = 1
	for i := 1; i <= n; i++ {
		fact[i] = (fact[i-1] * int64(i)) % m
	}

	f := make([][]int64, n+1)
	for i := 0; i <= n; i++ {
		f[i] = make([]int64, n+1)
	}
	for p_val := 0; p_val <= n; p_val++ {
		f[0][p_val] = fact[p_val]
	}
	for d := 1; d <= n; d++ {
		for p_val := d; p_val <= n; p_val++ {
			f[d][p_val] = (f[d-1][p_val] - f[d-1][p_val-1] + m) % m
		}
	}

	ans := make([]int64, n+1)
	in_S := make([]bool, n+2)
	for i := 1; i <= n; i++ {
		in_S[i] = true
	}
	c := n - 1
	c_prefix := 0

	for i := 0; i < n; i++ {
		L := n - i
		cnt := [2][2]int64{}

		for v := 1; v < p[i]; v++ {
			if in_S[v] {
				is_match := 0
				if i > 0 && v == p[i-1]+1 {
					is_match = 1
				}
				has_prev := 0
				if in_S[v-1] {
					has_prev = 1
				}
				cnt[is_match][has_prev]++
			}
		}

		for is_match := 0; is_match < 2; is_match++ {
			for has_prev := 0; has_prev < 2; has_prev++ {
				if cnt[is_match][has_prev] > 0 {
					FL := c_prefix + is_match
					C_star := c - has_prev
					for j := 0; j <= C_star; j++ {
						ways := (C[C_star][j] * f[C_star-j][L-1-j]) % m
						ways = (ways * cnt[is_match][has_prev]) % m
						ans[FL+j] = (ans[FL+j] + ways) % m
					}
				}
			}
		}

		in_S[p[i]] = false
		if in_S[p[i]-1] {
			c--
		}
		if in_S[p[i]+1] {
			c--
		}
		if i > 0 && p[i] == p[i-1]+1 {
			c_prefix++
		}
	}

	for k := 1; k <= n; k++ {
		if k > 1 {
			fmt.Print(" ")
		}
		fmt.Print(ans[n-k])
	}
	fmt.Println()
}