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)
}