← Home
For problem statement at 1000-1999/1600-1699/1670-1679/1671/problemF.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1670-1679/1671/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
)

const MOD = 998244353

var dp [4096][12][12][12]int32
var P [13][12][12]int32
var C [13][12][12]int32
var F [12][23][12][12]int32

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

func binomial(n, k int) int64 {
	if k < 0 || k > n {
		return 0
	}
	num := int64(1)
	den := int64(1)
	for i := 0; i < k; i++ {
		val := int64((n - i) % MOD)
		if val < 0 {
			val += MOD
		}
		num = (num * val) % MOD
		den = (den * int64(i+1)) % MOD
	}
	return (num * power(den, MOD-2)) % MOD
}

func initDP() {
	for i := 0; i < 12; i++ {
		dp[1<<i][i][0][0] = 1
	}

	for mask := 1; mask < 4096; mask++ {
		for last := 0; last < 12; last++ {
			if (mask & (1 << last)) == 0 {
				continue
			}
			for inv := 0; inv <= 11; inv++ {
				for desc := 0; desc <= 11; desc++ {
					ways := dp[mask][last][inv][desc]
					if ways == 0 {
						continue
					}
					for nextEl := 0; nextEl < 12; nextEl++ {
						if (mask & (1 << nextEl)) != 0 {
							continue
						}
						newMask := mask | (1 << nextEl)
						addedInv := bits.OnesCount(uint(mask >> (nextEl + 1)))
						newInv := inv + addedInv
						if newInv > 11 {
							continue
						}
						newDesc := desc
						if last > nextEl {
							newDesc++
						}
						if newDesc > 11 {
							continue
						}
						dp[newMask][nextEl][newInv][newDesc] = (dp[newMask][nextEl][newInv][newDesc] + ways) % MOD
					}
				}
			}
		}
	}

	for s := 1; s <= 12; s++ {
		mask := (1 << s) - 1
		for inv := 0; inv <= 11; inv++ {
			for desc := 0; desc <= 11; desc++ {
				sum := int32(0)
				for last := 0; last < s; last++ {
					sum = (sum + dp[mask][last][inv][desc]) % MOD
				}
				P[s][inv][desc] = sum
			}
		}
	}

	for s := 1; s <= 12; s++ {
		for i := 0; i <= 11; i++ {
			for d := 0; d <= 11; d++ {
				C[s][i][d] = P[s][i][d]
				for c := 1; c < s; c++ {
					for inv := 0; inv <= i; inv++ {
						for desc := 0; desc <= d; desc++ {
							term := (int64(C[c][inv][desc]) * int64(P[s-c][i-inv][d-desc])) % MOD
							C[s][i][d] = int32((int64(C[s][i][d]) - term + MOD) % MOD)
						}
					}
				}
			}
		}
	}

	F[0][0][0][0] = 1
	for c := 1; c <= 11; c++ {
		for sumS := 0; sumS <= 22; sumS++ {
			for sumI := 0; sumI <= 11; sumI++ {
				for sumD := 0; sumD <= 11; sumD++ {
					for size := 2; size <= 12; size++ {
						if sumS < size {
							continue
						}
						for inv := 1; inv <= 11; inv++ {
							if sumI < inv {
								continue
							}
							for desc := 1; desc <= 11; desc++ {
								if sumD < desc {
									continue
								}
								ways := C[size][inv][desc]
								if ways > 0 {
									term := (int64(F[c-1][sumS-size][sumI-inv][sumD-desc]) * int64(ways)) % MOD
									F[c][sumS][sumI][sumD] = int32((int64(F[c][sumS][sumI][sumD]) + term) % MOD)
								}
							}
						}
					}
				}
			}
		}
	}
}

func main() {
	initDP()
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var t int
	if _, err := fmt.Fscan(reader, &t); err != nil {
		return
	}

	for i := 0; i < t; i++ {
		var n, k, x int
		fmt.Fscan(reader, &n, &k, &x)
		ans := int64(0)
		for c := 1; c <= k; c++ {
			for sumS := 2 * c; sumS <= 2*k; sumS++ {
				ways := F[c][sumS][k][x]
				if ways > 0 {
					T := n - sumS
					if T >= 0 {
						bin := binomial(T+c, c)
						term := (int64(ways) * bin) % MOD
						ans = (ans + term) % MOD
					}
				}
			}
		}
		fmt.Fprintln(writer, ans)
	}
}