#include <bits/stdc++.h>
using namespace std;
const int N = 128, K = 1e5 + 15, MOD = 1e9 + 7;
struct STree {
  vector<long long> st;
  int n;
  STree() : st(4 * K + 5, 0), n(K) {}
  STree(int n) : st(4 * n + 5, 0), n(n) {}
  void upd(int k, int s, int e, int p, long long v) {
    if (s + 1 == e) {
      st[k] = v;
      return;
    }
    int m = (s + e) / 2;
    if (p < m)
      upd(2 * k, s, m, p, v);
    else
      upd(2 * k + 1, m, e, p, v);
    st[k] = (st[2 * k] + st[2 * k + 1]) % MOD;
  }
  long long query(int k, int s, int e, int a, int b) {
    if (s >= b || e <= a) return 0;
    if (s >= a && e <= b) return st[k];
    int m = (s + e) / 2;
    return (query(2 * k, s, m, a, b) + query(2 * k + 1, m, e, a, b)) % MOD;
  }
  void upd(int p, long long v) { upd(1, 0, n, p, v); }
  long long query(int a, int b) { return query(1, 0, n, a, b); }
};
int n, k, a[N];
STree s[N];
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> k;
  for (int i = 0; i < n; i++) cin >> a[i];
  s[n].upd(0, 1);
  for (int i = n - 1; i >= 0; i--) {
    for (int j = 0; j < k + 1; j++) {
      s[i].upd(j, s[i + 1].query(max(0, j - a[i]), j + 1));
    }
  }
  cout << s[0].query(k, k + 1) << endl;
}
