```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func min(a, b int) int {
if a < b {
return a
}
return b
}
func modpow(b, e, mod int64) int64 {
res := int64(1)
for e > 0 {
if e&1 == 1 {
res = res * b % mod
}
b = b * b % mod
e >>= 1
}
return res
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
var data []int
for scanner.Scan() {
x, _ := strconv.Atoi(scanner.Text())
data = append(data, x)
}
index := 0
N := data[index]
index++
M := data[index]
index++
d := data[index : index+N]
const MOD int64 = 998244353
const MAXN = 300010
S := 0
for _, v := range d {
S += v
}
if S%2 != 0 {
fmt.Println(modpow(int64(M), int64(N), MOD))
return
}
if S == 0 {
fmt.Println(modpow(int64(M), int64(N), MOD))
return
}
half := S / 2
pos := make([]int, N)
for i := 1; i < N; i++ {
pos[i] = pos[i-1] + d[i-1]
}
mp := make(map[int]int)
for i := 0; i < N; i++ {
mp[pos[i]] = i
}
vis := make([]bool, N)
K := 0
for i := 0; i < N; i++ {
if vis[i] {
continue
}
target := (pos[i] + half) % S
if j, ok := mp[target]; ok && !vis[j] {
K++
vis[i] = true
vis[j] = true
}
}
L := N - 2*K
fact := make([]int64, MAXN)
fact[0] = 1
for i := 1; i < MAXN; i++ {
fact[i] = fact[i-1] * int64(i) % MOD
}
invfact := make([]int64, MAXN)
invfact[MAXN-1] = modpow(fact[MAXN-1], MOD-2, MOD)
for i := MAXN - 2; i >= 0; i-- {
invfact[i] = invfact[i+1] * int64(i+1) % MOD
}
ans := int64(0)
max_t := min(K, M)
for t := 0; t <= max_t; t++ {
bc := (fact[K] * invfact[t] % MOD * invfact[K-t]) % MOD
pm := fact[M] * invfact[M-t] % MOD
m := M - t
pow1 := modpow(int64(m), int64(L), MOD)
mm1 := int64(0)
if m >= 1 {
mm1 = int64(m - 1)
} else {
mm1 = MOD - 1
}
base2 := (int64(m) * mm1) % MOD
pow2 := modpow(base2, int64(K-t), MOD)
ways := (bc * pm) % MOD
ways = (ways * pow1) % MOD
ways = (ways * pow2) % MOD
ans = (ans + ways) % MOD
}
fmt.Println(ans)
}
```