# coding: UTF-8

# <<<基本的なimport系>>>
import sys
from sys import stdin
input = stdin.readline
import math
import bisect

# <<<定数系>>>
# ここは問題によって法を変える
# MOD = 10**9+7
MOD = 998244353
nil = None
INF = 10**18

# <<<配列系>>>
# 番号a~b配列のスライスは、l[a:b+1]
# 1次元配列作成、値xをn個
def NewArray1(n,x):
    return [x]*n
# 2次元配列作成、値xをh行w列
def NewArray2(h,w,x):
    return [[x]*w for i in range(h)]
# 2次元配列aryのk番目で昇順ソート
def sort2up(ary,k):
    return sorted(ary, key=lambda x: x[k])
# 2次元配列aryのk番目で降順ソート
def sort2down(ary,k):
    return sorted(ary, reverse=True, key=lambda x: x[k])

# <<<二分探索系(必ずソートしてから使え!!!)>>>
# 配列aryにおけるx<aとなる要素xの個数:パターン1
def bsearch1(ary,a):
    return bisect.bisect_left(ary,a)
# 配列aryにおけるx<=aとなる要素xの個数:パターン2
def bsearch2(ary,a):
    return bisect.bisect_right(ary,a)
# 配列aryにおけるx>aとなる要素xの個数:パターン3
def bsearch3(ary,a):
    return len(ary)-bisect.bisect_right(ary,a)
# 配列aryにおけるx>=aとなる要素xの個数:パターン4
def bsearch4(ary,a):
    return len(ary)-bisect.bisect_left(ary,a)

# <<<数学系>>>
# 繰り返し二乗法
# ---> pow(底,累乗,MOD)の組み込み関数を使え!
# 組み合わせ(nCr)(MODをとっている)
def nCr(n,r):
    num = 1
    fact = 1
    for i in range(r):
        num = num * (n-i) % MOD
        fact = fact * (i+1) % MOD
    return num * pow(fact, MOD-2, MOD) % MOD
# 重複組み合わせ(nHr)(MODをとっている)
def nHr(n,r): # n個の異なるものからr個とってくる場合の数
    return nCr(n+r-1,r)

# <<<累積和>>>
'''
# 配列aの累積和がs
s = NewArray1(len(a)+1,nil)
s[0] = 0
for i in range(len(a)):
    s[i+1] = s[i] + a[i]
# AからBまでの和は s[B+1]-s[A]
'''

# <<<入出力系>>>
# 1行1数字
# int(input())
# 1行n数字(区切りあり)
# map(int, input().split())
# 1行n数字(リストに格納)
# list(map(int, input().split()))
# n行1数字(リストに格納)
# [int(input()) for _ in range(n)]
def p(x):
    print(x)


###
n, k = map(int, input().split())
a = list(map(int, input().split()))

sum = sum(a)
v = (sum*pow(2,k,MOD))%MOD
p(v)