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 Ruby (2.3.3) (judge verdict: Accepted)

n,a=gets.split.map(&:to_i)
array=gets.split.map(&:to_i)

smallarray=[]
ec=0
bigarray=[]

array.map{|value|
    if value-a<0
        smallarray.push(a-value)
    elsif value==a
        ec+=1
    else
        bigarray.push(value-a)
    end
}

bc=bigarray.count
sc=smallarray.count

dparray=Array.new(sc).map{Array.new(sc*50+1,0)}

if dparray[0]
    dparray[0][0]=1
    dparray[0][smallarray[0]]=1
end

(sc-1).times{|i|
   
    (sc*50+1).times{|j|
        add=smallarray[i+1]
       dparray[i+1][j]+=dparray[i][j]
       
       if dparray[i+1][j+add]
            dparray[i+1][j+add]+=dparray[i][j]
       end
    }
    
}


dparray2=Array.new(bc).map{Array.new(bc*50+1,0)}

if dparray2[0]
    dparray2[0][0]=1
    dparray2[0][bigarray[0]]=1
end

(bc-1).times{|i|
   
    (bc*50+1).times{|j|
        add=bigarray[i+1]
        dparray2[i+1][j]+=dparray2[i][j]
       
       if dparray2[i+1][j+add]
            dparray2[i+1][j+add]+=dparray2[i][j]
       end
    }
    
}


ans=2**ec-1


if dparray[0]&&dparray2[0]
    i=1
    loop{
        if dparray[-1][i] && dparray2[-1][i]
            seki=dparray[-1][i]*dparray2[-1][i]
            seki=seki*(2**ec)
            ans+=seki
        else
            break
        end
        i+=1
    }
    
end

puts ans