```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, " "))
}
```