#include using namespace std; using ll = long long; const ll MOD = 998244353; // a^e mod ll modpow(ll a, ll e){ ll r = 1; a %= MOD; while(e){ if(e & 1) r = r * a % MOD; a = a * a % MOD; e >>= 1; } return r; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vectorA(N+2, 0); for(int i = 1; i <= N; i++){ cin >> A[i]; } // b_j の計算 vector b(N+1); for(int i = 1; i < N; i++){ b[i] = (A[i] ^ A[i+1]); } b[N] = A[N]; // x_j = (-1)^{b_j} を MOD 表現 (1 または MOD-1) vector x(N+1); for(int i = 1; i <= N; i++){ x[i] = (b[i] ? MOD-1 : 1); } // 基本対称多項式 e[0..N] vector e(N+1, 0); e[0] = 1; for(int i = 1; i <= N; i++){ // 後ろから回さないと上書きが壊れる for(int j = i; j >= 1; j--){ e[j] = (e[j] + x[i] * e[j-1]) % MOD; } } // 定数 ll inv2 = (MOD + 1) / 2; ll inv2N = modpow(inv2, N); // 2^{-N} ll ans = 0; ll T = N + 1; // ℓ = 0..N for(int ell = 0; ell <= N; ell++){ // d = N - 2ℓ + 1 ll d = (ll)N - 2LL*ell + 1; // f_ell = (d^2 - T)/2 mod ll f = ( (d%MOD*d%MOD - T) % MOD + MOD ) % MOD; f = f * inv2 % MOD; // f^M ll pw = modpow(f, M); // e[ell] * f^M を足す ans = (ans + e[ell] * pw) % MOD; } // 最後に 2^{-N} を掛ける ans = ans * inv2N % MOD; cout << ans << "\n"; return 0; }