#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <typename T>
constexpr T inf = numeric_limits<T>::has_infinity
                      ? numeric_limits<T>::infinity()
                      : numeric_limits<T>::max() / 4;
template <typename T, typename U>
istream& operator>>(istream& is, pair<T, U>& a) {
  return is >> a.first >> a.second;
}
template <typename T>
istream& operator>>(istream& is, vector<T>& a) {
  for (T& x : a) is >> x;
  return is;
}
template <typename T>
using pop_max = std::priority_queue<T>;
template <typename T>
using pop_min = std::priority_queue<T, std::vector<T>, std::greater<T>>;
template <typename T>
void LOG(const T& x) {
  cerr << x << "\n";
}
template <typename T>
void LOG(const vector<T>& a) {
  for (const T& x : a) cerr << x << " ";
  cerr << "\n";
}
template <typename T>
void LOG(const vector<vector<T>>& a) {
  for (const auto& x : a) LOG(x);
}
template <typename T, std::size_t S>
void LOG(const T (&a)[S]) {
  for (ll i = 0, i_len = S; i < i_len; ++i) cerr << a[i] << " ";
  cerr << "\n";
}
template <typename T, std::size_t S, std::size_t R>
void LOG(const T (&a)[S][R]) {
  for (ll i = 0, i_len = S; i < i_len; ++i) {
    for (ll j = 0, j_len = R; j < j_len; ++j) cerr << a[i][j] << " ";
    cerr << "\n";
  }
}
ll ceil(ll a, ll b) { return a > 0 ? (a - 1) / b + 1 : a / b; }
ll gcd(ll a, ll b) {
  while (b != 0) {
    ll t = b;
    b = a % b;
    a = t;
  }
  return a;
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
ll gcd(const vector<ll>& v) {
  return accumulate(v.begin(), v.end(), 1LL, static_cast<ll (*)(ll, ll)>(gcd));
}
ll lcm(const vector<ll>& v) {
  return v.empty() ? 0LL
                   : accumulate(v.begin() + 1, v.end(), v[0],
                                static_cast<ll (*)(ll, ll)>(lcm));
}
ll pow(ll x, ll y, ll z) {
  ll a = 1;
  while (y > 0) {
    if (y & 1) a = a * x % z;
    x = x * x % z;
    y /= 2;
  }
  return a;
}
ll inv(ll x, ll m) { return pow(x, m - 2, m); }
template <typename T>
bool chmax(T& x, const T& y) {
  return x < y ? x = y, true : false;
}
template <typename T>
bool chmin(T& x, const T& y) {
  return x > y ? x = y, true : false;
}
struct InitCpp {
  InitCpp() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
  }
} init_cpp;
const ll INF = inf<ll>;
using P = pair<ll, ll>;
const ll M = 998244353;
ll dp[3010][3010][3];
signed main() {
  ll n, s;
  cin >> n >> s;
  vector<ll> A(n);
  cin >> A;
  dp[0][0][0] = 1;
  for (ll i = 0; i < n; i++) {
    for (ll v = 0; v <= s; v++) {
      dp[i + 1][v][0] = dp[i][v][0];
      dp[i + 1][v][1] = (v - A[i] >= 0 ? dp[i][v - A[i]][0] * (i + 1) : 0) +
                        dp[i][v][1] + (v - A[i] >= 0 ? dp[i][v - A[i]][1] : 0);
      dp[i + 1][v][2] =
          (v - A[i] >= 0 ? dp[i][v - A[i]][0] * (i + 1) * (n - i) : 0) +
          (v - A[i] >= 0 ? dp[i][v - A[i]][1] * (n - i) : 0) + dp[i][v][2];
    }
  }
  cout << dp[n][s][2] << endl;
}
