For problem statement at 0-999/0-99/30-39/37/problemD.txt this is a correct solution, but verifier at 0-999/0-99/30-39/37/verifierD.go ends with case 1 failed: expected 37 got 2220
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
const MOD int64 = 1000000007
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
var M int
if _, err := fmt.Fscan(in, &M); err != nil {
return
}
X := make([]int, M)
Y := make([]int, M)
N := 0
for i := 0; i < M; i++ {
fmt.Fscan(in, &X[i])
N += X[i]
}
for i := 0; i < M; i++ {
fmt.Fscan(in, &Y[i])
}
comb := make([][]int64, N+1)
for n := 0; n <= N; n++ {
comb[n] = make([]int64, n+1)
comb[n][0] = 1
comb[n][n] = 1
for k := 1; k < n; k++ {
v := comb[n-1][k-1] + comb[n-1][k]
if v >= MOD {
v -= MOD
}
comb[n][k] = v
}
}
firstWays := int64(1)
rem := N
for i := 0; i < M; i++ {
firstWays = firstWays * comb[rem][X[i]] % MOD
rem -= X[i]
}
dp := make([]int64, N+1)
dp[0] = 1
pref := 0
for i := 0; i < M; i++ {
xi, yi := X[i], Y[i]
ndp := make([]int64, N+1)
for p := 0; p <= pref; p++ {
cur := dp[p]
if cur == 0 {
continue
}
total := p + xi
low := 0
if total > yi {
low = total - yi
}
row := comb[total]
for q := low; q <= total; q++ {
add := cur * row[q] % MOD
ndp[q] += add
if ndp[q] >= MOD {
ndp[q] -= MOD
}
}
}
dp = ndp
pref += xi
}
ans := firstWays * dp[0] % MOD
out := bufio.NewWriterSize(os.Stdout, 1<<20)
fmt.Fprintln(out, ans)
out.Flush()
}