// Original C++ solution (slower):
#include<bits/stdc++.h>

using namespace std;

typedef  long long ll;

using vll=vector<ll>;

using vvll=vector<vll>;

using vi=vector<int>;

using vvi=vector<vector<int>>;

using vb=vector<bool>;

using pii=pair<int,int>;

using vpii=vector<pair<int,int>>;

using plli=pair<ll,int>;

using vplli=vector<pair<ll,int>>;

using pllll=pair<ll,ll>;

using vpllll=vector<pair<ll,ll>>;



template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}

template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}



//pow(llpow,modpow)

template<class T> ll llpow(ll x,T n){ll ans=1;if(x==0)ans=0;while(n){if(n&1)ans*=x;x*=x;n>>=1;}return ans;}

long long modpow(long long a, long long n, long long mod) {long long res = 1;while (n > 0) {if (n & 1) res = res * a % mod;a = a * a % mod;n >>= 1;}return res;}

//最大公約数

template<class T> inline T gcd(T x,T y){if(y==0)return x; else {return gcd(y,x%y);}}

//最小公倍数

template<class T> inline T lcm(T x,T y){return x/gcd(x,y)*y;}

//逆元

long long modinv(long long a, long long m) {long long b = m, u = 1, v = 0;while (b) {long long t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}u %= m;if (u < 0) u += m;return u;}



#define rep(i, begin_i, end_i) for (ll i = (ll)begin_i; i < (ll)end_i; i++)

//試験導入

#define irep(i, end_i, begin_i) for (ll i = (ll)begin_i-1; i >= (ll)end_i; i--)



long long INF = 1LL<<60;

ll dp[55][55][2510];

int main( ){

    int n;

    cin>>n;

    int a;

    cin>>a;

    vi x(n);

    rep(i,0,n)cin>>x[i];

    dp[0][0][0]=1;

    rep(i,0,n){

        rep(j,0,n){

            rep(k,0,2501){

                if(k+x[i]<2510)

                    dp[i+1][j+1][k+x[i]]+=dp[i][j][k];

                dp[i+1][j][k]+=dp[i][j][k];

            }

        }

    }

    ll ans=0;

        rep(j,1,n+1){

            ans+=dp[n][j][j*a];

        }

    cout<<ans<<endl;

    return 0;

}






// Optimized solution to the same problem (faster):
#include<bits/stdc++.h>

using namespace std;

typedef  long long ll;

using vll=vector<ll>;

using vvll=vector<vll>;

using vi=vector<int>;

using vvi=vector<vector<int>>;

using vb=vector<bool>;

using pii=pair<int,int>;

using vpii=vector<pair<int,int>>;

using plli=pair<ll,int>;

using vplli=vector<pair<ll,int>>;

using pllll=pair<ll,ll>;

using vpllll=vector<pair<ll,ll>>;



template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}

template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}



//pow(llpow,modpow)

template<class T> ll llpow(ll x,T n){ll ans=1;if(x==0)ans=0;while(n){if(n&1)ans*=x;x*=x;n>>=1;}return ans;}

long long modpow(long long a, long long n, long long mod) {long long res = 1;while (n > 0) {if (n & 1) res = res * a % mod;a = a * a % mod;n >>= 1;}return res;}

//最大公約数

template<class T> inline T gcd(T x,T y){if(y==0)return x; else {return gcd(y,x%y);}}

//最小公倍数

template<class T> inline T lcm(T x,T y){return x/gcd(x,y)*y;}

//逆元

long long modinv(long long a, long long m) {long long b = m, u = 1, v = 0;while (b) {long long t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}u %= m;if (u < 0) u += m;return u;}



#define rep(i, begin_i, end_i) for (ll i = (ll)begin_i; i < (ll)end_i; i++)

//試験導入

#define irep(i, end_i, begin_i) for (ll i = (ll)begin_i-1; i >= (ll)end_i; i--)



long long INF = 1LL<<60;

ll dp[55][5001];

int main( ){

    int n,a;

    cin>>n>>a;

    vi x(n);

    rep(i,0,n)cin>>x[i],x[i]-=a;

    dp[0][n*a]=1;

    rep(i,0,n){

        rep(j,0,5001){

            dp[i+1][j+x[i]]+=dp[i][j];

            dp[i+1][j]+=dp[i][j];

        }

    }

    cout<<dp[n][n*a]-1<<endl;

    return 0;

}






// Fastest known solution for this problem: