← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

const MOD = 998244353

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 ntt(a []int, invert bool) {
	n := len(a)
	for i, j := 1, 0; 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 l := 2; l <= n; l <<= 1 {
		wlen := power(3, (MOD-1)/l)
		if invert {
			wlen = power(wlen, MOD-2)
		}
		for i := 0; i < n; i += l {
			w := 1
			for j := 0; j < l/2; j++ {
				u := a[i+j]
				v := a[i+j+l/2] * w % MOD
				a[i+j] = (u + v) % MOD
				a[i+j+l/2] = (u - v + MOD) % MOD
				w = w * wlen % MOD
			}
		}
	}
	if invert {
		invN := power(n, MOD-2)
		for i := 0; i < n; i++ {
			a[i] = a[i] * invN % 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)
	return A
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(strings.TrimSpace(scanner.Text()))

	fact := make([]int, n+1)
	invFact := make([]int, n+1)
	inv := make([]int, n+1)
	H := make([]int, n+1)

	fact[0] = 1
	if n > 0 {
		inv[1] = 1
		H[1] = 1
		fact[1] = 1
	}

	for i := 2; i <= n; i++ {
		fact[i] = fact[i-1] * i % MOD
		inv[i] = (MOD - MOD/i) * inv[MOD%i] % MOD
		H[i] = (H[i-1] + inv[i]) % MOD
	}

	invFact[n] = power(fact[n], MOD-2)
	for i := n - 1; i >= 0; i-- {
		invFact[i] = invFact[i+1] * (i + 1) % MOD
	}

	k := (n - 1) / 2
	ans := make([]int, n)

	ans[0] = fact[n-1] * ((1 - (H[n-1] - H[k])%MOD + MOD) % MOD) % MOD

	if k > 0 {
		P := make([]int, k)
		Q := make([]int, k)
		for i := 0; i < k; i++ {
			P[i] = invFact[k-1-i]
			g_i := (1 - (H[n-2-i] - H[k])%MOD + MOD) % MOD
			Q[i] = fact[i] * g_i % MOD
		}
		R := multiply(P, Q)

		for i := 2; i <= k+1; i++ {
			m := i - 2
			C_m := R[k-1+m]
			S_m := C_m * invFact[m] % MOD
			ans[i-1] = fact[i-1] * fact[n-i] % MOD * S_m % MOD
		}
	}

	out := make([]string, n)
	for i := 0; i < n; i++ {
		out[i] = strconv.Itoa(ans[i])
	}
	fmt.Println(strings.Join(out, " "))
}
```