#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cassert>
#include<sstream>
#include<complex>
#include<cstdio>
#include<climits>
#include<cstdlib>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<ctime>
#include<cctype>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define inf (1<<28)
#define EPS 1e-10
#define equals(a,b) (fabs((a)-(b)) < EPS) 
#define all(n) (n).begin(),(n).end()
#define MOD (1000000007LL)

using namespace std;
typedef long long ll;
int N,W;

int main()
{

  cin >> N >> W;
  vector<int> w(N);
  rep(i,N)cin >> w[i];
  sort(all(w));
  
  int sum[N];
  rep(i,N)
    {
      if(i == 0)sum[i] = w[i];
      else      sum[i] = w[i] + sum[i-1];
    }

  ll dp[W+1];
  rep(i,W+1)dp[i] = 0;
  dp[0] = 1;
  ll ans = 0;

  for(int i=N-1;i>=0;i--)
    {
      if(w[i] > W)continue;

      int cost=(i-1<0?0:sum[i-1]);
      for(int j=max(0,W-(int)w[i]+1-cost);j<=W-cost;j++)
	{
	  ans = (ans+dp[j])%MOD;
	}

      for(int j=W;j>=0;j--)
	{
	  if(dp[j] == 0)continue;
	  if(j+w[i] > W)continue;
	  dp[j+w[i]] = (dp[j+w[i]]+dp[j]) % MOD;
	}
      /*
      if(i == 0)continue;
      int cost = (i-2<0?0:sum[i-2]);
      for(int j=max(0,W-(int)w[i-1]+1-cost);j<=W-cost;j++)
	{
	  ans = (ans+dp[j])%MOD;
	}
      */
    }

  //ans = (ans+dp[W])%MOD;

  if(ans == 0)ans = 1;

  cout << ans << endl;

  return 0;
}