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

using namespace std;



#define rep(i, n) for (int i = 0; i < n; ++i)

#define ALL(a) (a).begin(), (a).end()

#define rALL(a) (a).rbegin(), (a).rend()

#define SZ(x) ((int)(x).size())

using ll = long long;

using ull = unsigned long long;

using P = pair<int, int>;

using llP = pair<ll, ll>;

using DoP = pair<double, double>;

const int di[] = {0, 1, 0, -1, 1, 1, -1, -1};

const int dj[] = {1, 0, -1, 0, 1, -1, 1, -1};

const int INF = 1 << 28;

const ll INF64 = 1ll << 55;

const int mod = 1000000007;

//const int mod = 998244353;



template <class T>inline bool chmin(T &a, const T b)

{

  if (a > b)

  {

    a = b;

    return true;

  }

  return false;

}

template <class T>inline bool chmax(T &a, const T b)

{

  if (a < b)

  {

    a = b;

    return true;

  }

  return false;

}

template <class T>inline void line_out(const vector<T> vec) {

  int n = SZ(vec);

  rep(i, n) {

    cout << vec[i];

    if(i < n-1) cout << " ";

  }

  cout << endl;

  return;

}



struct mint

{

  ll x; // typedef long long ll;

  mint(ll x = 0) : x((x % mod + mod) % mod) {}

  mint operator-() const { return mint(-x); }

  mint &operator+=(const mint a)

  {

    if ((x += a.x) >= mod)

      x -= mod;

    return *this;

  }

  mint &operator-=(const mint a)

  {

    if ((x += mod - a.x) >= mod)

      x -= mod;

    return *this;

  }

  mint &operator*=(const mint a)

  {

    (x *= a.x) %= mod;

    return *this;

  }

  mint operator+(const mint a) const

  {

    mint res(*this);

    return res += a;

  }

  mint operator-(const mint a) const

  {

    mint res(*this);

    return res -= a;

  }

  mint &operator++()

  {

    if ((x += 1) >= mod)

      x -= mod;

    return *this;

  }

  mint &operator--()

  {

    if ((x += mod - 1) >= mod)

      x -= mod;

    return *this;

  }

  mint operator*(const mint a) const

  {

    mint res(*this);

    return res *= a;

  }

  mint pow(ll t) const

  {

    if (!t)

      return 1;

    mint a = pow(t >> 1);

    a *= a;

    if (t & 1)

      a *= *this;

    return a;

  }



  // for prime mod

  mint inv() const

  {

    return pow(mod - 2);

  }

  mint &operator/=(const mint a)

  {

    return (*this) *= a.inv();

  }

  mint operator/(const mint a) const

  {

    mint res(*this);

    return res /= a;

  }

};



int main()

{

  int n, a;

  cin >> n >> a;

  vector<int> x(n);

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

  



  vector<vector<vector<ll>>> dp(n+1, vector<vector<ll>>(n+1, vector<ll>(2600, 0ll)));

  rep(i, n+1) rep(j, n+1) rep(s, 2600) dp[i][j][s] = 0;



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



  rep(i, n) {

    for(int j = 0; j <= n; ++j) {

      for(int s = 0; s <= 2500; ++s) {

        if(j > 0 && s-x[i] >= 0) dp[i+1][j][s] += dp[i][j-1][s-x[i]];

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

      }

    }

  }



  ll ans = 0;

  for(int i = 1; i <= n; ++i) ans += dp[n][i][a*i];

  cout << ans << endl;

}

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

using namespace std;



// エイリアス

using  ll = long signed long;

using ull = long unsigned long;

using  ld = long double;

using   P = pair<int, int>;

using llP = pair<ll, ll>;

using DoP = pair<double, double>;



// 汎用マクロ

#define ALL(a) (a).begin(), (a).end()

#define RALL(a) (a).rbegin(), (a).rend()

#define rep(i, n) for (int i = 0; i < n; ++i)

#define FOREACH(i,q) for (auto &i : q)

#define UNIQUE(v) do { sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end()); } while (false)

#define SZ(x) ((int)(x).size())

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

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

template <class T>inline void line_out(const vector<T> vec) {int n = SZ(vec); rep(i, n) { cout << vec[i]; if(i < n-1) cout << " ";}cout << endl;}

const int di[] = {0, 1, 0, -1, 1, 1, -1, -1};

const int dj[] = {1, 0, -1, 0, 1, -1, 1, -1};

const int INF = 1 << 28;

const ll INF64 = 1ll << 60;

const int mod = 1000000007;

//const int mod = 998244353;

struct mint

{

  ll x; // typedef long long ll;

  mint(ll x = 0) : x((x % mod + mod) % mod) {}

  mint operator-() const { return mint(-x); }

  mint &operator+=(const mint a)

  {

    if ((x += a.x) >= mod)

      x -= mod;

    return *this;

  }

  mint &operator-=(const mint a)

  {

    if ((x += mod - a.x) >= mod)

      x -= mod;

    return *this;

  }

  mint &operator*=(const mint a)

  {

    (x *= a.x) %= mod;

    return *this;

  }

  mint operator+(const mint a) const

  {

    mint res(*this);

    return res += a;

  }

  mint operator-(const mint a) const

  {

    mint res(*this);

    return res -= a;

  }

  mint &operator++()

  {

    if ((x += 1) >= mod)

      x -= mod;

    return *this;

  }

  mint &operator--()

  {

    if ((x += mod - 1) >= mod)

      x -= mod;

    return *this;

  }

  mint operator*(const mint a) const

  {

    mint res(*this);

    return res *= a;

  }

  mint pow(ll t) const

  {

    if (!t)

      return 1;

    mint a = pow(t >> 1);

    a *= a;

    if (t & 1)

      a *= *this;

    return a;

  }



  // for prime mod

  mint inv() const

  {

    return pow(mod - 2);

  }

  mint &operator/=(const mint a)

  {

    return (*this) *= a.inv();

  }

  mint operator/(const mint a) const

  {

    mint res(*this);

    return res /= a;

  }

};





int main()

{

  int n, a; cin >> n >> a;

  vector<int> x(n);

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

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



  const int SUM_MAX = 2510;

  vector<vector<ll>> dp(n+1, vector<ll>(SUM_MAX*2, 0));



  dp[0][SUM_MAX] = 1;

  rep(i, n) {

    for(int sum = 0; sum < 2*SUM_MAX; ++sum) {

      if(0 <= sum+x[i] && sum+x[i] < SUM_MAX*2) dp[i+1][sum+x[i]] += dp[i][sum];

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

    }

  }

  cout << dp[n][SUM_MAX] - 1 << endl;

}


// Fastest known solution for this problem: