← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD int64 = 998244353
const ROOT int64 = 3

func powMod(a, e int64) int64 {
	res := int64(1)
	for e > 0 {
		if e&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		e >>= 1
	}
	return res
}

func ntt(a []int64, invert bool) {
	n := len(a)
	for i, j := 1, 0; i < n; i++ {
		bit := n >> 1
		for ; j&bit != 0; bit >>= 1 {
			j ^= bit
		}
		j ^= bit
		if i < j {
			a[i], a[j] = a[j], a[i]
		}
	}
	for length := 2; length <= n; length <<= 1 {
		wlen := powMod(ROOT, (MOD-1)/int64(length))
		if invert {
			wlen = powMod(wlen, MOD-2)
		}
		half := length >> 1
		for i := 0; i < n; i += length {
			w := int64(1)
			for j := 0; j < half; j++ {
				u := a[i+j]
				v := a[i+j+half] * w % MOD
				a[i+j] = u + v
				if a[i+j] >= MOD {
					a[i+j] -= MOD
				}
				a[i+j+half] = u - v
				if a[i+j+half] < 0 {
					a[i+j+half] += MOD
				}
				w = w * wlen % MOD
			}
		}
	}
	if invert {
		nInv := powMod(int64(n), MOD-2)
		for i := 0; i < n; i++ {
			a[i] = a[i] * nInv % MOD
		}
	}
}

func convolution(a, b []int64) []int64 {
	need := len(a) + len(b) - 1
	n := 1
	for n < need {
		n <<= 1
	}
	fa := make([]int64, n)
	fb := make([]int64, n)
	copy(fa, a)
	copy(fb, b)
	ntt(fa, false)
	ntt(fb, false)
	for i := 0; i < n; i++ {
		fa[i] = fa[i] * fb[i] % MOD
	}
	ntt(fa, true)
	return fa[:need]
}

func countSubseq(m, base int) []int64 {
	if m == 0 {
		return []int64{1}
	}
	L := m*base + m + 1
	A := make([]int64, L)
	B := make([]int64, L)
	O := make([]int64, L)
	nA := make([]int64, L)
	nB := make([]int64, L)
	nO := make([]int64, L)

	A[base] = 1
	B[1] = 1
	O[0] = 24

	for l := 1; l < m; l++ {
		for i := 0; i < L; i++ {
			nA[i] = 0
			nB[i] = 0
			nO[i] = 0
		}
		for x := 0; x <= l; x++ {
			start := x * base
			maxY := l - x
			for y := 0; y <= maxY; y++ {
				i := start + y
				va := A[i]
				if va != 0 {
					nB[i+1] += va
					nO[i] += va * 24
				}
				vb := B[i]
				if vb != 0 {
					nA[i+base] += vb
					nO[i] += vb * 24
				}
				vo := O[i]
				if vo != 0 {
					nA[i+base] += vo
					nB[i+1] += vo
					nO[i] += vo * 23
				}
			}
		}
		for i := 0; i < L; i++ {
			if nA[i] >= MOD {
				nA[i] -= MOD
			}
			if nB[i] >= MOD {
				nB[i] -= MOD
			}
			if nO[i] >= MOD {
				nO[i] %= MOD
			}
		}
		A, nA = nA, A
		B, nB = nB, B
		O, nO = nO, O
	}

	res := make([]int64, L)
	for i := 0; i < L; i++ {
		v := A[i] + B[i]
		if v >= MOD {
			v -= MOD
		}
		v += O[i]
		if v >= MOD {
			v -= MOD
		}
		res[i] = v
	}
	return res
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	var n int
	fmt.Fscan(in, &n)
	c := make([]int, 26)
	for i := 0; i < 26; i++ {
		fmt.Fscan(in, &c[i])
	}

	base := n + 1
	odd := (n + 1) / 2
	even := n / 2

	po := countSubseq(odd, base)
	var pe []int64
	if even == odd {
		pe = po
	} else {
		pe = countSubseq(even, base)
	}

	conv := convolution(po, pe)

	W := n + 2
	suf := make([]int64, W*W)

	for x := 0; x <= n; x++ {
		row := x * W
		start := x * base
		maxY := n - x
		for y := 0; y <= maxY; y++ {
			idx := start + y
			if idx < len(conv) {
				suf[row+y] = conv[idx]
			}
		}
	}

	for x := n; x >= 0; x-- {
		row := x * W
		nextRow := row + W
		for y := n; y >= 0; y-- {
			v := suf[row+y] + suf[nextRow+y] + suf[row+y+1] - suf[nextRow+y+1]
			v %= MOD
			if v < 0 {
				v += MOD
			}
			suf[row+y] = v
		}
	}

	ans := suf[0]
	for i := 0; i < 26; i++ {
		v := suf[(c[i]+1)*W]
		ans -= v
		if ans < 0 {
			ans += MOD
		}
	}
	for i := 0; i < 26; i++ {
		for j := i + 1; j < 26; j++ {
			v := suf[(c[i]+1)*W+(c[j]+1)]
			ans += v
			if ans >= MOD {
				ans -= MOD
			}
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprint(out, ans)
	out.Flush()
}