def f_knapsack_for_all_subsets(MOD=998244353):

    N, S = [int(i) for i in input().split()]

    A = [int(i) for i in input().split()]



    # dp[i][j]: i 番目の要素を見たとき、和が j であるような場合の数

    dp = [[0 for j in range(S + 1)] for i in range(N + 1)]

    dp[0][0] = 1  # インデックスの集合が空のとき、和は 0 の 1 通り

    for i, a in enumerate(A):

        for j in range(S + 1):

            # editorial でいうところの選択肢 2, 3 に相当するので、2 倍

            dp[i + 1][j] += 2 * dp[i][j]

            dp[i + 1][j] %= MOD

            if j + a <= S:  # 選択肢 1

                dp[i + 1][j + a] += dp[i][j]

                dp[i + 1][j + a] %= MOD

    return dp[N][S]



print((f_knapsack_for_all_subsets()))
def f_knapsack_for_all_subsets_power_series(MOD=998244353, MAX=3010):

    # 参考: https://maspypy.com/atcoder-参加感想-2020-05-31abc-169

    import numpy as np

    N, S = [int(i) for i in input().split()]

    A = [int(i) for i in input().split()]



    f = np.zeros(MAX + 1, np.int64)  # 次数が S より大きな項には興味ないため、こうする

    f[0] = 1  # f_{0}(x) = 1

    for a in A:

        # f_{n+1} = f_{n} * (2 + x**a) = 2 * f_{n} + x**a * f_{n}

        f_next = 2 * f  # 第一項

        f_next[a:] += f[:-a]  # 第二項

        f_next %= MOD

        f = f_next

    return f[S]



print((f_knapsack_for_all_subsets_power_series()))
def f_knapsack_for_all_subsets(MOD=998244353):
    N, S = [int(i) for i in input().split()]
    A = [int(i) for i in input().split()]
    # dp[i][j]: i 番目の要素を見たとき、和が j であるような場合の数
    dp = [[0 for j in range(S + 1)] for i in range(N + 1)]
    dp[0][0] = 1  # インデックスの集合が空のとき、和は 0 の 1 通り
    for i, a in enumerate(A):
        for j in range(S + 1):
            # editorial でいうところの選択肢 2, 3 に相当するので、2 倍
            dp[i + 1][j] += 2 * dp[i][j]
            dp[i + 1][j] %= MOD
            if j + a <= S:  # 選択肢 1
                dp[i + 1][j + a] += dp[i][j]
                dp[i + 1][j + a] %= MOD
    return dp[N][S]


print((f_knapsack_for_all_subsets()))

def f_knapsack_for_all_subsets_power_series(MOD=998244353, MAX=3010):
    # 参考: https://maspypy.com/atcoder-参加感想-2020-05-31abc-169
    import numpy as np

    N, S = [int(i) for i in input().split()]
    A = [int(i) for i in input().split()]
    f = np.zeros(MAX + 1, np.int64)  # 次数が S より大きな項には興味ないため、こうする
    f[0] = 1  # f_{0}(x) = 1
    for a in A:
        # f_{n+1} = f_{n} * (2 + x**a) = 2 * f_{n} + x**a * f_{n}
        f_next = 2 * f  # 第一項
        f_next[a:] += f[:-a]  # 第二項
        f_next %= MOD
        f = f_next
    return f[S]


print((f_knapsack_for_all_subsets_power_series()))

-def f_knapsack_for_all_subsets(MOD=998244353): +def f_knapsack_for_all_subsets_power_series(MOD=998244353, MAX=3010): +    # 参考: https://maspypy.com/atcoder-参加感想-2020-05-31abc-169 +    import numpy as np + -    # dp[i][j]: i 番目の要素を見たとき、和が j であるような場合の数 -    dp = [[0 for j in range(S + 1)] for i in range(N + 1)] -    dp[0][0] = 1  # インデックスの集合が空のとき、和は 0 の 1 通り -    for i, a in enumerate(A): -        for j in range(S + 1): -            # editorial でいうところの選択肢 2, 3 に相当するので、2 倍 -            dp[i + 1][j] += 2 * dp[i][j] -            dp[i + 1][j] %= MOD -            if j + a <= S:  # 選択肢 1 -                dp[i + 1][j + a] += dp[i][j] -                dp[i + 1][j + a] %= MOD -    return dp[N][S] +    f = np.zeros(MAX + 1, np.int64)  # 次数が S より大きな項には興味ないため、こうする +    f[0] = 1  # f_{0}(x) = 1 +    for a in A: +        # f_{n+1} = f_{n} * (2 + x**a) = 2 * f_{n} + x**a * f_{n} +        f_next = 2 * f  # 第一項 +        f_next[a:] += f[:-a]  # 第二項 +        f_next %= MOD +        f = f_next +    return f[S] -print((f_knapsack_for_all_subsets())) +print((f_knapsack_for_all_subsets_power_series()))