← Home
For problem statement at 0-999/800-899/810-819/814/problemE.txt this is a correct solution, but verifier at 0-999/800-899/810-819/814/verifierE.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"fmt"
)

const MOD = 1000000007

var fact [255]int
var invFact [255]int
var invPowerOf2 [255]int
var comb [255][255]int

var memoG [155][155]int
var memo [55][55]int

var n int
var d []int

func power(base, exp int) int {
	res := 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 int) int {
	return power(n, MOD-2)
}

func initPre() {
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= 250; i++ {
		fact[i] = (fact[i-1] * i) % MOD
		invFact[i] = modInverse(fact[i])
	}

	inv2 := modInverse(2)
	invPowerOf2[0] = 1
	for i := 1; i <= 250; i++ {
		invPowerOf2[i] = (invPowerOf2[i-1] * inv2) % MOD
	}

	for i := 0; i <= 250; i++ {
		comb[i][0] = 1
		for j := 1; j <= i; j++ {
			comb[i][j] = (comb[i-1][j-1] + comb[i-1][j]) % MOD
		}
	}

	for i := 0; i < 155; i++ {
		for j := 0; j < 155; j++ {
			memoG[i][j] = -1
		}
	}

	for i := 0; i < 55; i++ {
		for j := 0; j < 55; j++ {
			memo[i][j] = -1
		}
	}
}

func getG(n1, n2 int) int {
	if n1 < 0 || n2 < 0 {
		return 0
	}
	if n1 == 0 && n2 == 0 {
		return 1
	}
	if memoG[n1][n2] != -1 {
		return memoG[n1][n2]
	}
	res := 0
	if n1 > 0 {
		if n1 >= 2 {
			res = (res + (n1-1)*getG(n1-2, n2)) % MOD
		}
		if n2 >= 1 {
			res = (res + n2*getG(n1, n2-1)) % MOD
		}
	} else {
		if n2 >= 3 {
			ways := ((n2 - 1) * (n2 - 2) / 2) % MOD
			res = (res + ways*getG(2, n2-3)) % MOD
		}
	}
	memoG[n1][n2] = res
	return res
}

func solve(i, s int) int {
	if i == n+1 {
		if s == 0 {
			return 1
		}
		return 0
	}
	if i+s-1 > n {
		return 0
	}
	if s == 0 {
		return 0
	}
	if memo[i][s] != -1 {
		return memo[i][s]
	}

	C1 := 0
	C2 := 0
	for v := i; v <= i+s-1; v++ {
		if d[v] == 2 {
			C1++
		} else if d[v] == 3 {
			C2++
		}
	}

	ways := 0
	for k11 := 0; k11 <= C1; k11++ {
		for k21 := 0; k21 <= C2; k21++ {
			for k22 := 0; k21+k22 <= C2; k22++ {
				c20 := C2 - k21 - k22
				n1 := k11 + k21
				n2 := k22
				S := (C1 - k11) + 2*c20 + k21

				term := (comb[C1][k11] * fact[C2]) % MOD
				term = (term * invFact[k21]) % MOD
				term = (term * invFact[k22]) % MOD
				term = (term * invFact[c20]) % MOD

				term = (term * fact[S]) % MOD
				term = (term * getG(n1, n2)) % MOD
				term = (term * invPowerOf2[c20]) % MOD

				nextWays := solve(i+s, S)
				term = (term * nextWays) % MOD

				ways = (ways + term) % MOD
			}
		}
	}
	memo[i][s] = ways
	return ways
}

func main() {
	initPre()
	if _, err := fmt.Scan(&n); err != nil {
		return
	}
	d = make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Scan(&d[i])
	}

	ans := solve(2, d[1])
	fmt.Println(ans)
}