Problem:
Score : 600 points

Problem Statement

Given are a sequence of N positive integers A_1, A_2, \ldots, A_N and another positive integer S.

For a non-empty subset T of the set \{1, 2, \ldots , N \}, let us define f(T) as follows:

f(T) is the number of different non-empty subsets \{x_1, x_2, \ldots , x_k \} of T such that A_{x_1}+A_{x_2}+\cdots +A_{x_k} = S.

Find the sum of f(T) over all 2^N-1 subsets T of \{1, 2, \ldots , N \}. Since the sum can be enormous, print it modulo 998244353.

Constraints

All values in input are integers.

1 \leq N \leq 3000

1 \leq S \leq 3000

1 \leq A_i \leq 3000

Input

Input is given from Standard Input in the following format:

N S
A_1 A_2 ... A_N

Output

Print the sum of f(T) modulo 998244353.

Sample Input 1

3 4
2 2 4

Sample Output 1

6

For each T, the value of f(T) is shown below. The sum of these values is 6.

f(\{1\}) = 0

f(\{2\}) = 0

f(\{3\}) = 1 (One subset \{3\} satisfies the condition.)

f(\{1, 2\}) = 1 (\{1, 2\})

f(\{2, 3\}) = 1 (\{3\})

f(\{1, 3\}) = 1 (\{3\})

f(\{1, 2, 3\}) = 2 (\{1, 2\}, \{3\})

Sample Input 2

5 8
9 9 9 9 9

Sample Output 2

0

Sample Input 3

10 10
3 1 4 1 5 9 2 6 5 3

Sample Output 3

3296

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include"bits/stdc++.h"
using namespace std;
#define ll long long
#define FOR(i, j, k, in) for (int i=j ; i<k ; i+=in)
#define RFOR(i, j, k, in) for (int i=j ; i>=k ; i-=in)
#define rep(i, j) FOR(i, 0, j, 1)
#define rrep(i, j) RFOR(i, j, 0, 1)
#define MP make_pair
#define PB push_back
#define INF (int)1e9
#define endl "\n"
#define MOD 998244353
#define DEB(x) cout<<"##"<<x<<"##"<<endl;
ll fastex(int a,int b){
    if(b==0)
        return 1;
    ll t=fastex(a,b/2);
    if(b%2==0)
        return (t*t)%MOD;
    return (((t*t)%MOD)*a)%MOD;
}
ll modinv(int x){
    return fastex(x,MOD-2);
}
int main() 
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    #ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n,sum;
    cin>>n>>sum;
    int ar[n+1];
    //ar[0]=0;
    rep(i,n)
    cin>>ar[i+1];
    int dp[305][305]={0};
    dp[0][0]=fastex(2,n)%MOD;
    for(int i=0;i<=n;i++){
        for(int j=0;j<=sum;j++){
            dp[i+1][j]=(dp[i+1][j]+dp[i][j])%MOD;
            if(i>=1){
                if(j+ar[i]<=sum){
                    dp[i+1][j+ar[i]]=(dp[i+1][j+ar[i]]+dp[i][j]*modinv(2))%MOD;
                }
            }
        }
    }
    cout<<dp[n+1][sum];
    return 0;
}