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 OCaml (4.02.3) (judge verdict: Accepted)

open Printf
let input_int_array n =
	Array.init n (fun _ -> Scanf.scanf " %d" (fun v -> v))

let get_int () = Scanf.scanf " %d" (fun v -> v)
let get_2_ints () = Scanf.scanf " %d %d" (fun u v -> u,v)
let get_3_ints () = Scanf.scanf " %d %d %d" (fun u v w -> u,v,w)
let get_4_ints () = Scanf.scanf " %d %d %d %d" (fun u v w x -> u,v,w,x)
let get_5_ints () = Scanf.scanf " %d %d %d %d %d" (fun u v w x y -> u,v,w,x,y)

module Int64 = struct
	include Int64
	let (+|) p q = Int64.add p q
	let (-|) p q = Int64.sub p q
	let ( *|) p q = Int64.mul p q
	let (/|) p q = Int64.div p q
	let (<|) p q = 
		if Int64.compare p q < 0 then true 
		else false
	let (>|) p q = 
		if Int64.compare p q > 0 then true
		else false
	let (>=|) p q = not (p < q)
	let (<=|) p q = not (p > q)
	let labs p = if p <| 0L then -1L*|p else p
	let (~|) p = Int64.of_int p
end


let dump_2darr f a =
	Array.fold_left (fun u v ->
		u ^ Array.fold_left (fun u v -> u ^ (f v) ^ ",") "" v ^ ";\n"
	) "" a |> print_endline


let () =
	let n,a = get_2_ints ()
	in let ar = input_int_array n
	in let mx = (Array.fold_left max 0 ar)*n
	in let open Bigarray in let open Int64
	in
	let dp = Bigarray.Array3.create int64 c_layout (n+5) (n+5) (mx+1)
	in dp.{0,0,0} <- 1L;
	for i=0 to n-1 do
		for j=0 to n do
			for k=0 to mx do
				dp.{i+1,j,k} <- dp.{i,j,k} +| (
					let v = k-ar.(i) in
					if j>=1 && v>=0 then dp.{i,j-1,v} else 0L
				)
			done
		done
	done;
	let s = ref 0L in
	for k=1 to n do
		if a*k <= mx then
		s := !s +| dp.{n,k,a*k}
	done;
	!s |> printf "%Ld\n"