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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.Scanner;
import java.util.Arrays;

class Main{

  private static int[] input;
  private static long[][][] data;

  public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);
    int cardN = Integer.parseInt(scanner.next());
    int average = Integer.parseInt(scanner.next());
    input = new int[cardN];
    for(int i=0; i<cardN; i++){
      input[i] = Integer.parseInt(scanner.next());
    }
    data = new long[cardN][cardN][cardN*50];
    for(int i=0; i<cardN; i++){
      for(int j=0; j<cardN; j++){
        Arrays.fill(data[i][j], -1l);
      }
    }

    long ans = 0l;

    for(int i=1; i<cardN; i++){
      ans += merge(cardN, i, i*average);
    }

    System.out.println(ans);
  }

  private static long merge(int totalN, int groupN, int sum){
    if(totalN == 0){
      if(groupN==0 && sum==0){
        data[0][0][0] = 1l;
        return 1l;
      }else{
        data[0][groupN][sum] = 0l;
        return 0l;
      }
    }else if(totalN > 0){
      long ans = 0l;
      if(groupN>=0 && sum>=0){
        if(data[totalN-1][groupN][sum]==-1l){
          data[totalN-1][groupN][sum] = merge(totalN-1, groupN, sum);
        }
        ans += data[totalN-1][groupN][sum];
        if(groupN-1>=0 && sum-input[totalN-1]>=0){
          if(data[totalN-1][groupN-1][sum-input[totalN-1]]==-1){
            data[totalN-1][groupN-1][sum-input[totalN-1]] = merge(totalN-1, groupN-1, sum-input[totalN-1]);
          }
          ans += data[totalN-1][groupN-1][sum-input[totalN-1]];
        }
        return ans;
      }else{
        return 0l;
      }
    }else{
      return 0l;
    }
  }
}