package main import . "fmt" const M = 998244353 func main() { var n int Scan(&n) grid := make([][]byte, n) for i := range grid { var s string Scan(&s) grid[i] = []byte(s) } pack := func(x1,y1,x2,y2 int) int { return (x1 << 0) | (y1 << 8) | (x2 << 16) | (y2 << 24) } unpack := func(p int) (x1,y1,x2,y2 int) { x1 = (p >> 0) & 0xFF y1 = (p >> 8) & 0xFF x2 = (p >> 16) & 0xFF y2 = (p >> 24) & 0xFF return } update := func(m map[int]int, x1,y1,x2,y2,c int) { if 0 <= x1 && x1 < n && 0 <= y1 && y1 < n { if 0 <= x2 && x2 < n && 0 <= y2 && y2 < n { if grid[y1][x1] == grid[y2][x2] { p := pack(x1, y1, x2, y2) m[p] = (m[p] + c) % M } } } } tmp1 := map[int]int{} for i := 0; i < n; i++ { x, y := i, (n-1)-i p := pack(x,y,x,y) tmp1[p] = 1 } for i := 1; i < n; i++ { tmp2 := map[int]int{} for p, c := range tmp1 { x1,y1,x2,y2 := unpack(p) update(tmp2,x1-1,y1,x2+1,y2,c) update(tmp2,x1-1,y1,x2,y2+1,c) update(tmp2,x1,y1-1,x2+1,y2,c) update(tmp2,x1,y1-1,x2,y2+1,c) } tmp1 = tmp2 } if len(tmp1) == 0 { Println(0) } else { for _, c := range tmp1 { Println(c) } } }