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 C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>

int main(void){
	int N, A, max = -1;
	int x[51] = {0};
	scanf("%d %d",&N,&A);
	for(int a = 1; a < N+1; a++) scanf("%d", &x[a]);
	for(int a = 1; a < N+1; a++){
		if(x[a] > max) max = x[a];
	}
	if(max < A) max = A;

	long long int list[N+1][N+1][N*max];
	long long int result = 0;

	for(int a = 0; a < N+1; a++){
		for(int b = 0; b < N+1; b++){
			for (int c = 0; c < N*max; c++){
				if(!a && !b && !c){
					list[a][b][c] = 1; //first principle
				} else if(a >= 1 && c < x[a]){
					list[a][b][c] = list[a-1][b][c]; // second principle
				} else if(a >= 1 && b >= 1 && c >= x[a]){
					list[a][b][c] = list[a-1][b][c] + list[a-1][b-1][c-x[a]]; // third principle
				} else {
					list[a][b][c] = 0; // fourth principle
				}
			}
		}
	}

	for(int a = 1; a < N+1; a++) result += list[N][a][a*A];
	printf("%lld\n",result);
	return 0;
}