Problem:
Score : 300 points

Problem Statement

Tak has N cards. On the i-th (1 \leq i \leq N) card is written an integer x_i.
He is selecting one or more cards from these N cards, so that the average of the integers written on the selected cards is exactly A.
In how many ways can he make his selection?

Constraints

1 \leq N \leq 50

1 \leq A \leq 50

1 \leq x_i \leq 50

N,\,A,\,x_i are integers.

Partial Score

200 points will be awarded for passing the test set satisfying 1 \leq N \leq 16.

Input

The input is given from Standard Input in the following format:

N A
x_1 x_2 ... x_N

Output

Print the number of ways to select cards such that the average of the written integers is exactly A.

Sample Input 1

4 8
7 9 8 9

Sample Output 1

5

The following are the 5 ways to select cards such that the average is 8:

Select the 3-rd card.

Select the 1-st and 2-nd cards.

Select the 1-st and 4-th cards.

Select the 1-st, 2-nd and 3-rd cards.

Select the 1-st, 3-rd and 4-th cards.

Sample Input 2

3 8
6 6 9

Sample Output 2

0

Sample Input 3

8 5
3 6 2 8 7 6 5 9

Sample Output 3

19

Sample Input 4

33 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

Sample Output 4

8589934591

The answer may not fit into a 32-bit integer.

Solution in PHP (5.6.30) (judge verdict: Time Limit Exceeded)

<?php

// こちらの解答を参考にさせていただきました
// http://abc044.contest.atcoder.jp/submissions/862062

function do_dp($cards, $n, $ave) {
    //$max = $n * 50;
    $max = 0;
    foreach ($cards as $card) {
        $max += $card;
    }

    $dp = [];

    // $dp[$i][$j][$k]
    // $i <- 選択するか否かを判定しているカードの位置
    // $j <- 残りピック枚数
    // $k <- 残り合計数

    // 全ての取りうる組み合わせを0で初期化
    for ($i = 0; $i < $n + 1; $i++) {
        for($j = 0; $j < $n + 1; $j++) {
            for ($k = 0; $k < $max + 1; $k++) {
                $dp[$i][$j][$k] = 0;
            }
        }
    }

    $dp[$n][0][0] = 1;
    for($i = $n - 1; $i >= 0; $i--) {
        $dp[$i][0][0] = 1;
        for ($j = 1; $j < $n + 1; $j++) {
            for($k = 0; $k < $max + 1; $k++) {
                if ($k < $cards[$i]) {
                    $dp[$i][$j][$k] = $dp[$i + 1][$j][$k];
                } else {
                    $dp[$i][$j][$k] = $dp[$i + 1][$j][$k] + $dp[$i + 1][$j - 1][$k - $cards[$i]];
                }
            }
        }
    }

    $sum = 0;
    for ($l = 1; $l < $n + 1; $l++) {
        $sum += $dp[0][$l][$l * $ave];
    }

    return $sum;

}

list($n, $ave) = explode(' ', trim(fgets(STDIN)));
$cards = explode(' ', trim(fgets(STDIN)));

echo do_dp($cards, $n, $ave);
echo "\n";