For problem statement at 1000-1999/1900-1999/1910-1919/1919/problemE.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1910-1919/1919/verifierE.go ends with All tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
var fact []int
var invFact []int
func initFact(maxN int) {
fact = make([]int, maxN+1)
invFact = make([]int, maxN+1)
fact[0] = 1
invFact[0] = 1
for i := 1; i <= maxN; i++ {
fact[i] = (fact[i-1] * i) % MOD
}
invFact[maxN] = power(fact[maxN], MOD-2)
for i := maxN - 1; i >= 1; i-- {
invFact[i] = (invFact[i+1] * (i + 1)) % MOD
}
}
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 nCr(n, r int) int {
if r < 0 || r > n {
return 0
}
if n == 0 && r == 0 {
return 1
}
num := fact[n]
den := (invFact[r] * invFact[n-r]) % MOD
return (num * den) % MOD
}
func main() {
initFact(15005)
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)
P := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(reader, &P[i])
}
m := 0
M := 0
for _, p := range P {
if p < m {
m = p
}
if p > M {
M = p
}
}
offset := -m + 2
size := M - m + 5
C := make([]int, size)
C[0+offset]++
for _, p := range P {
C[p+offset]++
}
possibleOverall := true
for v := m; v <= M; v++ {
if C[v+offset] == 0 {
possibleOverall = false
break
}
}
if !possibleOverall {
fmt.Fprintln(writer, 0)
continue
}
uniqueP := make([]int, 0)
if n > 0 {
uniqueP = append(uniqueP, P[0])
for i := 1; i < n; i++ {
if P[i] != P[i-1] {
uniqueP = append(uniqueP, P[i])
}
}
}
totalWays := 0
Ev := make([]int, size)
F := make([]int, size)
R := make([]int, size)
L := make([]int, size)
for _, E := range uniqueP {
for i := 0; i < size; i++ {
Ev[i] = 0
F[i] = 0
R[i] = 0
L[i] = 0
}
for v := m - 1; v <= M; v++ {
if v >= m {
Ev[v+offset] = C[v+offset]
if v == E {
Ev[v+offset]--
}
}
if 0 <= v && v < E {
F[v+offset] = 1
} else if E <= v && v < 0 {
F[v+offset] = -1
} else {
F[v+offset] = 0
}
}
R[M+offset] = 0
possible := true
for v := M; v >= m; v-- {
L[v+offset] = Ev[v+offset] - R[v+offset]
R[v-1+offset] = L[v+offset] + F[v-1+offset]
if L[v+offset] < 0 || R[v+offset] < 0 {
possible = false
break
}
}
if !possible || L[m+offset] != 0 {
continue
}
ways := 1
for v := m; v <= M; v++ {
ev := Ev[v+offset]
rv := R[v+offset]
lv := L[v+offset]
if v < E {
ways = (ways * nCr(ev-1, rv-1)) % MOD
} else if v > E {
ways = (ways * nCr(ev-1, lv-1)) % MOD
} else {
ways = (ways * nCr(ev, rv)) % MOD
}
if ways == 0 {
break
}
}
totalWays = (totalWays + ways) % MOD
}
fmt.Fprintln(writer, totalWays)
}
}