← Home
For problem statement at 0-999/900-999/960-969/960/problemG.txt this is a correct solution, but verifier at 0-999/900-999/960-969/960/verifierG.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
)

const MOD = 998244353
const G = 3

func power(base, exp int) int {
	res := 1
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func inverse(n int) int {
	return power(n, MOD-2)
}

func ntt(a []int, invert bool) {
	n := len(a)
	j := 0
	for i := 1; i < n; i++ {
		bit := n >> 1
		for j&bit != 0 {
			j ^= bit
			bit >>= 1
		}
		j ^= bit
		if i < j {
			a[i], a[j] = a[j], a[i]
		}
	}

	for length := 2; length <= n; length <<= 1 {
		half := length >> 1
		wLen := power(G, (MOD-1)/length)
		if invert {
			wLen = inverse(wLen)
		}
		for i := 0; i < n; i += length {
			w := 1
			for j := 0; j < half; j++ {
				u := a[i+j]
				v := (a[i+j+half] * w) % MOD
				a[i+j] = (u + v) % MOD
				a[i+j+half] = (u - v + MOD) % MOD
				w = (w * wLen) % MOD
			}
		}
	}

	if invert {
		nInv := inverse(n)
		for i := 0; i < n; i++ {
			a[i] = (a[i] * nInv) % MOD
		}
	}
}

func multiply(a, b []int) []int {
	n := 1
	for n < len(a)+len(b) {
		n <<= 1
	}
	A := make([]int, n)
	B := make([]int, n)
	copy(A, a)
	copy(B, b)

	ntt(A, false)
	ntt(B, false)
	for i := 0; i < n; i++ {
		A[i] = (A[i] * B[i]) % MOD
	}
	ntt(A, true)

	resLen := len(a) + len(b) - 1
	res := make([]int, resLen)
	copy(res, A[:resLen])
	return res
}

func solve(l, r int) []int {
	if l == r {
		return []int{l % MOD, 1}
	}
	mid := l + (r-l)/2
	return multiply(solve(l, mid), solve(mid+1, r))
}

func nCr(n, r int) int {
	if r < 0 || r > n {
		return 0
	}
	num := 1
	den := 1
	for i := 1; i <= r; i++ {
		num = (num * (n - i + 1)) % MOD
		den = (den * i) % MOD
	}
	return (num * inverse(den)) % MOD
}

func main() {
	var n, a, b int
	if _, err := fmt.Scan(&n, &a, &b); err != nil {
		return
	}

	if a == 0 || b == 0 || a+b-2 > n-1 {
		fmt.Println(0)
		return
	}

	if n == 1 {
		if a == 1 && b == 1 {
			fmt.Println(1)
		} else {
			fmt.Println(0)
		}
		return
	}

	poly := solve(0, n-2)
	k := a + b - 2
	if k >= len(poly) {
		fmt.Println(0)
		return
	}

	ans := (poly[k] * nCr(k, a-1)) % MOD
	fmt.Println(ans)
}