← Home
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()
}