//Name: My friends are small
//Level:
//Category:
//Note:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

#define FOREACH(it,c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define TIMES(i,n) for(int (i) = 0; (i) < (n); ++(i))

typedef long long LL;
const LL MOD = 1000000007;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int N, K;
    while(cin >> N >> K) {
        //dp[i][w] = v[i...N]でwを作るパターン数
        vector<vector<LL> > dp(N+1, vector<LL>(10001, 0));
        vector<int> v(N);
        TIMES(i, N) {
            cin >> v[i];
        }
        sort(v.begin(), v.end());

        dp[N][0] = 1;
        for(int i = N-1; i >= 0; --i) {
            dp[i] = dp[i+1];
            TIMES(w, K+1) {
                if(w < v[i]) continue;
                dp[i][w] += dp[i+1][w-v[i]];
                dp[i][w] %= MOD;
            }
        }

        /*
        TIMES(i, N) {
            TIMES(w, K) {
                cout << dp[i][w] << ' ';
            }
            cout << endl;
        }
        */

        LL ans = 0;
        int sum = 0;
        TIMES(i, N) {
            // skip v[i]
            const int remain = K - sum;
            for(int w = max(0, K-sum-v[i]+1); w <= remain; ++w) {
                ans += dp[i+1][w];
                ans %= MOD;
            }
            sum += v[i];
            if(sum > K) break;
        }
        // use all
        if(sum <= K) {
            ans += 1;
            ans %= MOD;
        }
        cout << ans << endl;
    }
    return 0;
}