#include<iostream>
#include<cstring>
using namespace std;

int f[1000],o;
int x[50]={0};
long long sum=0;

long long ZuHe(int n,int k)
{
long long temp=1;
long long f=1;
for(int i=0;i<k;i++)
{
f *= i+1;
temp *= (n-i) ;//
}
return (temp / f) ;
}

int display(int k)
{
    int flag=1,i,a[100+10],flag2=0,bb=0;
	memset(a,0,sizeof(a));
    long long p=1;
    for(i=0;i<k;i++)
    	a[x[i]]++;
    for(int i=1;i<=100+1;i++)
    	if (a[i]>f[i]){
    		flag=0;
    		break;
		}
	if (flag==1) for(int i=1;i<=100+1;i++){
		if (a[i]!=0) bb+=a[i];
	}
	if (flag==1 && bb!=o) flag=0;
	//if (flag==1) cout<<endl;
	if (flag==1) for (int i=1;i<=100+10;i++){
		if (a[i]!=0) {
			p=p*ZuHe(f[i],a[i]);
			//cout<<f[i]<<" "<<a[i]<<" "<<" "<<ZuHe(f[i],a[i])<<endl;;
		}
		//if (a[i]!=0)cout<<i<<"*"<<a[i]<<"("<<f[i]<<")";
	}
//	if (flag==1) cout<<endl;
	if (flag==1)
	sum+=p;
}

void split(int n,int k)//k是数组中的位置，亦是递归层数
{
    void display(int k);
    int i;
    if(n==0)//分解完成，输出结果
        display(k);
    else
        for(i=n;i>0;i--)
            if(k==0||i<=x[k-1])
            {
                x[k]=i;//写入数组
                split(n-i,k+1);
            }
}


int main(){
	int n,x;
	memset(f,0,sizeof(f));
//	freopen("f.txt","r",stdin);
//	cout<<ZuHe(4,2)<<endl; return 0;
	cin>>n>>x;
	int k;
	for (int i=1;i<=n;i++){
		cin>>k;
		f[k]++;
	}
	for ( o=1;o<=n;o++)
	split(x*o,0);
	cout<<sum<<endl;
}