intreadInt(){ int ans = 0, c, f = 1; while (!isdigit(c = getchar())) if (c == '-') f *= -1; do ans = ans * 10 + c - '0'; while (isdigit(c = getchar())); return ans * f; }
constint N = 100000; constint mod = 998244353; constint g = 3;
int n, m, len, rev[N]; LL omega[N], iomega[N];
LL pow_mod(LL a, LL b){ LL ans = 1; for (a %= mod; b; b >>= 1, a = a * a % mod) if (b & 1) ans = ans * a % mod; return ans; }
voidInitNTT(int n){ int k = 0; len = 1; while (len < n) len <<= 1, ++k; for (int i = 1; i < len; ++i) rev[i] = ((i & 1) << (k - 1)) | (rev[i >> 1] >> 1); omega[0] = iomega[0] = 1; LL w = pow_mod(g, (mod - 1) / len); for (int i = 1; i < len; ++i) iomega[len - i] = omega[i] = omega[i - 1] * w % mod; }
voidNTT(LL *A, const LL *omega){ for (int i = 0; i < len; ++i) if (i < rev[i]) std::swap(A[i], A[rev[i]]); for (int h = 2; h <= len; h <<= 1) for (int j = 0; j < len; j += h) { const LL *w = omega; for (int i = j; i < j + (h >> 1); ++i) { LL _t1 = A[i], _t2 = A[i + (h >> 1)] * *w % mod; A[i] = (_t1 + _t2) % mod; A[i + (h >> 1)] = (_t1 - _t2) % mod; w += len / h; } } if (omega == ::iomega) for (int i = 0, v = -(mod - 1) / len; i < len; ++i) A[i] = A[i] * v % mod; }
LL inv[N], ifac[N]; LL A[N], G[N];
intmain(){ n = readInt(); m = readInt() + 1; LL x = readInt(); inv[1] = ifac[0] = ifac[1] = 1; for (int i = 2; i < m; ++i) ifac[i] = ifac[i - 1] * (inv[i] = -(mod / i) * inv[mod % i] % mod) % mod; for (int i = 0; i < m; ++i) { A[i] = readInt() * ifac[i] % mod; G[i] = i & 1 ? -ifac[i] : ifac[i]; } InitNTT(m * 2); NTT(A, omega); NTT(G, omega); for (int i = 0; i < len; ++i) G[i] = G[i] * A[i] % mod; NTT(G, iomega); LL t = 1, ans = 0; for (int i = 0; i < m; ++i) { ans = (ans + G[i] * t) % mod; t = t * x % mod * (n - i) % mod; } printf("%lld\n", (ans + mod) % mod); return0; }