For problem statement at 1000-1999/1900-1999/1940-1949/1942/problemG.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1942/verifierG.go ends with test 1 failed
input:
1
0 0 0
expected:0
got:1
exit status 1 can you fix the verifier? package main
import (
"bytes"
"io"
"os"
"strconv"
)
const MOD int64 = 998244353
type Test struct {
a int
c int
}
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(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
t := nextInt()
tests := make([]Test, t)
maxN := 5
maxK := 5
for i := 0; i < t; i++ {
a := nextInt()
_ = nextInt()
c := nextInt()
tests[i] = Test{a: a, c: c}
z := a + 5
if z > maxK {
maxK = z
}
if z+c > maxN {
maxN = z + c
}
if 2*z-6 > maxN {
maxN = 2*z - 6
}
}
fac := make([]int64, maxN+1)
ifac := make([]int64, maxN+1)
fac[0] = 1
for i := 1; i <= maxN; i++ {
fac[i] = fac[i-1] * int64(i) % MOD
}
ifac[maxN] = modPow(fac[maxN], MOD-2)
for i := maxN; i >= 1; i-- {
ifac[i-1] = ifac[i] * int64(i) % MOD
}
comb := func(n, r int) int64 {
if n < 0 || r < 0 || r > n {
return 0
}
return fac[n] * ifac[r] % MOD * ifac[n-r] % MOD
}
pref := make([]int64, maxK+1)
choose5 := make([]int64, maxK+1)
for k := 5; k <= maxK; k++ {
v := comb(2*k-6, k-5) - comb(2*k-6, k)
if v < 0 {
v += MOD
}
pref[k] = v
choose5[k] = comb(k, 5)
}
var out bytes.Buffer
for i, tc := range tests {
z := tc.a + 5
c := tc.c
invTotal := ifac[z+c] * fac[c] % MOD * fac[z] % MOD
invZ5 := ifac[z] * fac[5] % MOD * fac[z-5] % MOD
lim := z - 1
if c+5 < lim {
lim = c + 5
}
sub := int64(0)
for k := 5; k <= lim; k++ {
phit := pref[k] * comb(z+c-2*k+5, c-k+5) % MOD * invTotal % MOD
loss := 1 - choose5[k]*invZ5%MOD
if loss < 0 {
loss += MOD
}
sub += phit * loss % MOD
if sub >= MOD {
sub -= MOD
}
}
ans := int64(1) - sub
if ans < 0 {
ans += MOD
}
out.WriteString(strconv.FormatInt(ans, 10))
if i+1 < t {
out.WriteByte('\n')
}
}
os.Stdout.Write(out.Bytes())
}