← Home
For problem statement at 1000-1999/1500-1599/1520-1529/1525/problemE.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1520-1529/1525/verifierE.go ends with case 1 failed
expected: 0
got: 2

exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

const MOD int64 = 998244353

func modPow(a, e int64) int64 {
	res := int64(1)
	for e > 0 {
		if e&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		e >>= 1
	}
	return res
}

func main() {
	data, _ := io.ReadAll(bufio.NewReaderSize(os.Stdin, 1<<20))
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		x := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			x = x*10 + int(data[idx]-'0')
			idx++
		}
		return x
	}

	n := nextInt()
	m := nextInt()

	size := n + 2
	cnt := make([]uint8, m*size)

	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			d := nextInt()
			cnt[j*size+d]++
		}
	}

	fact := int64(1)
	for i := 1; i <= n; i++ {
		fact = fact * int64(i) % MOD
	}
	invFact := modPow(fact, MOD-2)

	ans := int64(0)

	for j := 0; j < m; j++ {
		base := j * size
		fail := int64(1)
		suffix := 0
		for r := n; r >= 1; r-- {
			suffix += int(cnt[base+r+1])
			factor := suffix - (n - r)
			if factor <= 0 {
				fail = 0
				break
			}
			fail *= int64(factor)
		}

		val := int64(1)
		if fail != 0 {
			val = (val - (fail%MOD)*invFact%MOD + MOD) % MOD
		}

		ans += val
		if ans >= MOD {
			ans -= MOD
		}
	}

	os.Stdout.WriteString(strconv.FormatInt(ans, 10))
}