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 PHP (7.4.4) (judge verdict: Accepted)

<?php
// perl -le 'print "str" x n'
// 1 <= N <= 3000
// 1 <= S <= 3000
// 1 <= A <= 3000
// N S
// A1 A2 AN
// 998244353 のあまり
// 536870912
// echo (2**29).PHP_EOL;
// 1073741824
// echo (2**30).PHP_EOL;

$powmap = [];
(function () use (&$powmap) {
    for ($i = 0; $i < 60; $i++) {
        $powmap[$i] = (2**$i)%998244353;
    }
    for ($i = 60; $i <= 3000; $i++) {
        $powmap[$i] = ($powmap[$i-1]*2)%998244353;
    }
})();

(function () use ($powmap) {
    $stdin = trim(fgets(STDIN));
    list($N, $S) = explode(' ', $stdin, 2);
    $N = intval($N);
    $S = intval($S);

    $stdin = trim(fgets(STDIN));
    $A = explode(' ', $stdin);

    // $A = array_filter($A, function ($v) use ($S) {
    //     return $S>=$v;
    // });
    $N = count($A);
    rsort($A);
    (function () use ($A) {
        $num = 0;
        foreach ($A as $v) {
            $num += $v;
            if ($num >= $S) {
                return;
            }
        }
        echo 0;
        exit;
    })();
    sort($A);

    $total = 0;

    $map = [];
    foreach ($A as $i => $av) {
        foreach ($map as $mp => $mv) {
            if ($mp + $av <= $S) {
                $map[$mp + $av] += $mv;
            }
            $map[$mp] = ($mv * 2)%998244353;
        }
        $map[$av] += $powmap[$i];
        krsort($map);
        // var_dump([$av, $map]);
    }

    $total = $map[$S];
    echo ($total%998244353).PHP_EOL;
})();
// 1<=e1<=e2<=e3
// f({e1}) = {e1} = 0
// f({e2}) = {e2} = 0
// f({e3}) = {e3} = 1
// f({e1,e2}) => {e1}+{e2}+{e1,e2} = 0,0,1 = 1
// f({e1,e3}) => {e1}+{e3}+{e1,e3} = 0,1,0 = 1
// f({e2,e3}) => {e2}+{e3}+{e2,e3} = 0,1,0 = 1
// f({e1,e2,e3}) => {e1}+{e2}+{e3}+{e1,e2}+{e1,e3}+{e2,e3}+{e1,e2,e3} = 0,0,1,1,0,0,0=2

// {e1}<{e1,e2},{e1,e3},{e2,e3},{e1,e2,e3}
// {e2}<{e1,e2},{e1,e3},{e2,e3},{e1,e2,e3}
// {e3}<{e1,e3},{e2,e3},{e1,e2,e3}
// {e1,e2}<={e1,e3},{e2,e3}
// {e1,e2}<{e1,e2,e3}
// {e1,e3}<={e2,e3}
// {e1,e3}<{e1,e2,e3}
// {e2,e3}<{e1,e2,e3}

// {e1}<{e1,e2},{e1,e3},{e2,e3},{e1,e2,e3}
// {e2}<{e1,e2},{e1,e3},{e2,e3},{e1,e2,e3}
// {e3}<{e1,e3},{e2,e3},{e1,e2,e3}
// {e1,e2}<={e1,e3},{e2,e3}
// {e1,e2}<{e1,e2,e3}
// {e1,e3}<={e2,e3}
// {e1,e3}<{e1,e2,e3}
// {e2,e3}<{e1,e2,e3}