← Home
For problem statement at 1000-1999/1900-1999/1910-1919/1912/problemB.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1910-1919/1912/verifierB.go ends with All 80 tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD int64 = 998244353

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) nextInt64() int64 {
	var sign int64 = 1
	var val int64 = 0
	c, _ := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, _ = fs.r.ReadByte()
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int64(c-'0')
		c2, err := fs.r.ReadByte()
		if err != nil {
			break
		}
		c = c2
	}
	return val * sign
}

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 prepareFac(maxN int) ([]int64, []int64) {
	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
	}
	return fac, ifac
}

func comb(n, k int, fac, ifac []int64) int64 {
	if k < 0 || k > n || n < 0 {
		return 0
	}
	return fac[n] * ifac[k] % MOD * ifac[n-k] % MOD
}

func coeffTri(m, i int, fac, ifac []int64) int64 {
	if i < 0 || i > 2*m {
		return 0
	}
	low := 0
	if i-m > low {
		low = i - m
	}
	high := i / 2
	if high > m {
		high = m
	}
	var res int64 = 0
	for c := low; c <= high; c++ {
		// C(m, c) * C(m-c, i-2c)
		res += comb(m, c, fac, ifac) * comb(m-c, i-2*c, fac, ifac) % MOD
		if res >= MOD {
			res -= MOD
		}
	}
	return res
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	t := int(in.nextInt64())
	ns := make([]int64, t)
	ks := make([]int, t)
	maxK := 0
	for i := 0; i < t; i++ {
		ns[i] = in.nextInt64()
		ks[i] = int(in.nextInt64())
		if ks[i] > maxK {
			maxK = ks[i]
		}
	}
	fac, ifac := prepareFac(maxK)

	for i := 0; i < t; i++ {
		n := ns[i]
		k := ks[i]
		R := n - int64(k+1)
		var D int64
		var r int64
		var minCost int64
		if R <= int64(k-1) {
			D = 0
			r = R
			minCost = 0
			// ways = coeff of (1+z)^{k-1} at z^r = C(k-1, r)
			ways := comb(k-1, int(r), fac, ifac)
			fmt.Fprintf(out, "%d %d\n", minCost, ways%MOD)
			continue
		} else {
			num := R - int64(k-1)
			den := int64(2 * k)
			D = (num + den - 1) / den
			L := int64(2*k)*D - int64(k+1)
			r = R - L
			minCost = int64(k)*D*(D-1) + r*D
		}
		m := k - 1
		// ways = coeff of (1+z)^2 * (1+z+z^2)^{m} at z^r
		c0 := coeffTri(m, int(r), fac, ifac)
		c1 := coeffTri(m, int(r-1), fac, ifac)
		c2 := coeffTri(m, int(r-2), fac, ifac)
		ways := (c0 + 2*c1 + c2) % MOD
		fmt.Fprintf(out, "%d %d\n", minCost, ways)
	}
}
```