#include <bits/stdc++.h>
using namespace std;
class segment_tree {
  vector<long long> t;
  long size;

 public:
  segment_tree() {}
  segment_tree(long n) {
    t.assign(4 * n + 1, 0);
    size = n;
  }
  void initialize(long n) {
    t.assign(4 * n + 1, 0);
    size = n;
  }
  void initialize_with_array(long startpos, long l, long r, vector<int>& v) {
    if (l == r) {
      t[startpos] = v[l];
    } else {
      long m = (l + r) / 2;
      initialize_with_array(2 * startpos, l, m, v);
      initialize_with_array(2 * startpos + 1, m + 1, r, v);
      t[startpos] = t[startpos * 2] + t[startpos * 2 + 1];
    }
  }
  void initialize_array(vector<int>& v) {
    initialize_with_array(1, 0, size - 1, v);
  }
  void update(long index, long val) { update_full(1, 0, size - 1, index, val); }
  void update_full(long startpos, long l, long r, long index, long long val) {
    if (l > r) return;
    if (l == r) {
      t[startpos] += val;
    } else {
      long m = (l + r) / 2;
      if (index <= m)
        update_full(2 * startpos, l, m, index, val);
      else
        update_full(2 * startpos + 1, m + 1, r, index, val);
      t[startpos] = t[startpos * 2] + t[startpos * 2 + 1];
    }
  }
  long long query(long l, long r) {
    if (l > r) {
      return 0;
    }
    return query_full(1, 0, size - 1, l, r);
  }
  long long query_full(long startpos, long left, long right, long l, long r) {
    if ((left >= l) && (right <= r)) return t[startpos];
    long long m = (left + right) / 2, ans = 0;
    if (m >= l) {
      ans += query_full(startpos * 2, left, m, l, r);
    }
    if (m + 1 <= r) {
      ans += query_full(startpos * 2 + 1, m + 1, right, l, r);
    }
    return ans;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, k, i, j, ans, x, b, MOD = 1000000007;
  cin >> n >> k;
  vector<long long> a(n);
  for (i = 0; i < n; i++) cin >> a[i];
  segment_tree st(k + 1);
  vector<long long> dp(k + 1, 0);
  dp[k] = 1;
  st.update(k, 1);
  for (i = 0; i < n; i++) {
    for (j = 0; j <= k; j++) {
      b = min(k, j + a[i]);
      x = st.query(j, b) % MOD;
      st.update(j, x - dp[j]);
      dp[j] = x;
    }
  }
  ans = dp[0] % MOD;
  cout << ans << "\n";
  return 0;
}
