#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
using namespace std;

typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007

int N, W;
int A[10000];
int dp0[10001][201];
int dp1[10001][201];

signed main() {
  ios::sync_with_stdio(false); cin.tie(0);
  cin >> N >> W;
  rep(i, N) cin >> A[i];
  sort(A, A+N);

  dp0[0][0] = 1;
  rep(i, N) {
    rep(w, W+1) {
      rep(k, N+1) dp1[w][k] = 0;
    }
    // k>0
    for (int k=1; k<=i; k++) {
      for (int w=W; w>=A[i]; w--) {
        dp1[w][k] += dp0[w-A[i]][k];
        if (dp1[w][k] >= MOD) dp1[w][k] -= MOD;
      }
      rep(w, W+1) {
        dp1[w][k] += dp0[w][k];
        if (dp1[w][k] >= MOD) dp1[w][k] -= MOD;
      }
    }
    // k=0
    rep(w, W+1) {
      dp1[w][i+1] += dp0[w][0];
      dp1[w][i+1] %= MOD;
      if (dp1[w][i+1] >= MOD) dp1[w][i+1] -= MOD;
    }
    for (int w=W; w>=A[i]; w--) {
      dp1[w][0] += dp0[w-A[i]][0];
      dp1[w][0] %= MOD;
      if (dp1[w][0] >= MOD) dp1[w][0] -= MOD;
    }
    rep(w, W+1) swap(dp0[w], dp1[w]);
  }
  int s = 0;
  rep(k, N+1) {
    rep(w, W+1) {
      if (dp0[w][k] == 0 || (k>0&&w+A[k-1]<=W)) continue;
      s += dp0[w][k];
      if (s >= MOD) s -= MOD;
    }
  }
  cout << s << "\n";
  return 0;
}