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 Java7 (OpenJDK 1.7.0) (judge verdict: Accepted)

import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Double;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeSet;
import java.lang.Object;
 
public class Main {
    Scanner sc = new Scanner(System.in);
   
    public static void main(String[] args) {
        new Main(); 
    }
   
    public Main() {
        new C().doIt();
    }
    class C{
    	long dp_table(int num[],int max,int ans,int cnt){
    		long dp[][] = new long[51][2501];
    		long result = 0;
    		for(int i = 0;i < max;i++){
    			dp[i][num[i]]++;
    			if(num[i] == ans)result++;
    		}
    		for(int i = 0;i < max - 1;i++){
    			long dp2[][] = new long[51][2501];
    			ans = ans + cnt;
    			for(int l = i;l < max - 1;l++){
    			for(int j = 0;j < 50*(l+1) + 1;j++){
    				for(int k = l + 1;k < max;k++){
    					dp2[k][j + num[k]] = dp[l][j] + dp2[k][j + num[k]];
    				}
    			}
    			}
    			for(int j = i+1;j < max;j++){
        			for(int k = 0;k < 2501;k++){
        				dp[j][k] = dp2[j][k];
        				if(k == ans){
        					result = result + dp[j][k];
        				}
        			}
        		}
//    			for(int j = i+1;j < max;j++){
//        			for(int k = 0;k < 40;k++){
//        				System.out.print(dp[j][k]+" ");
//        			}
//        			System.out.println();
//    			}
//    			System.out.println(result+" "+ans+" "+max+" "+i);
    		}
    		return result;
    	}
    	void doIt(){
    		int n = sc.nextInt();
    		int ans = sc.nextInt();
    		int num[] = new int[n];
    		for(int i = 0;i < n;i++){
    			num[i] = sc.nextInt();
    		}
    		long sum = 0;
    		sum = dp_table(num,n,ans,ans);
    		System.out.println(sum);
    	}
    }
}