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++14 (GCC 5.4.1) (judge verdict: Accepted)

/*  ***  In The Name of God ... ***  */ 
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
 
 
#define int long long
#define all(v) v.begin() , v.end()

template<typename T> inline bool smin(T &a, const T &b){ return b < a ? a = b,1:0;}
template<typename T> inline bool smax(T &a, const T &b){ return a < b ? a = b,1:0;}
 
const int N = 50 + 10 , maxn = 50 * 50 + 10 ; 
 
int n , a [ N ] , A , dp [ N ] [ maxn ] [ N ] ;  
 
int32_t main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> A ;
	for ( int i = 1 ; i <= n ; i++ )
		cin >> a [ i ] ;
	dp [ 0 ] [ 0 ] [ 0 ]++ ; 
	dp [ 1 ] [ 0 ] [ 0 ]++ ; 
	dp [ 1 ] [ a [ 1 ] ] [ 1 ]++ ; 
	for ( int i = 2 ; i <= n ; i++ ) {
		for ( int j = maxn - 1 ; j >= 0 ; j-- ) {
			for ( int t = 0 ; t <= i ; t++ ) {
				dp [ i ] [ j ] [ t ] = dp [ i - 1 ] [ j ] [ t ] ;
				if ( j - a [ i ] >= 0 && t )
					dp [ i ] [ j ] [ t ] += dp [ i - 1 ] [ j - a [ i ] ] [ t - 1 ] ;
			}
		}
	}
	int ans = 0 ;
	for ( int i = 0 ; i < maxn ; i++ ) {
		for ( int j = 1 ; j <= n ; j++ ) {
			if ( j * A == i ) { 
				ans += dp [ n ] [ i ] [ j ] ;
			}
		}
	}
	cout << ans << '\n' ; 
}