fun main() {
    val (n,s) = readLine()!!.split(" ").map { it.toInt() }
    val mod = 998244353L
    val arr = readLine()!!.split(" ").map { it.toInt() }
    val inf = Long.MIN_VALUE
    val dp = Array(2){LongArray(s+1){0} }

    var cur = 0
    var next = 1

    dp[cur][0] = 1L
    dp[next][0] = 1L

    // f(t) is the number of different non-empty subsets
    // dp[cur][x] = sum of f(x), 부분 집합의 총 합이 x 인 것들의 갯수.

    // f(x, s) 는 주어진 원소 집합 x 의 모든 부분 집합들에 대해서, 그 부분 집합들의 총합이 s 가 되는 것들의 갯수.
    // 목표는 모든 원소들의 집합 형태인 f(x,s) 의 합.
    // dp[idx][x]
    // 원소 idx 까지의 집합 형태를 고려했을때, f(idx, x) 의 합. => sum ( f(idx), x )
    //  sum (f(idx, x))  = sum( f(idx - 1, x) ) * 2 : 합이 x 가 되는 idx - 1 까지 고려한 set 과 idx 까지 고려한 set 에서, idx 를 포함하지 않는 경우
    //                     sum( f(idx - 1, x - a[idx]



    for(i in 0 until n) {
        val c = arr[i]
//        for(j in 1..s) {
//            dp[next][j] = 0
//        }
        for(j in 0..s) {
            dp[next][j] = (dp[cur][j] * 2L) % mod
        }
        for(j in 1..s) {
            if(j < c) continue
            dp[next][j] += dp[cur][j-c]
            dp[next][j] %= mod
        }
        cur = next
        next = (next + 1) % 2
    }
    print(dp[cur][s])
}