#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  return (a < b ? false : (a = b, true));
}
template <class T>
bool uax(T &a, T b) {
  return (a > b ? false : (a = b, true));
}
const int MOD = 1e9 + 7;
void add(int &a, int b) {
  a += b;
  if (a >= MOD) {
    a -= MOD;
  }
}
struct BIT {
  int n;
  vector<int> tree;
  BIT(int _n) : n(_n + 1) { tree.resize(n + 2); }
  inline int lsb(int x) { return (x & (-x)); }
  void update(int pos, int val) {
    ++pos;
    while (pos <= n) {
      add(tree[pos], val);
      pos += lsb(pos);
    }
  }
  int query(int pos) {
    ++pos;
    int ret = 0;
    while (pos) {
      add(ret, tree[pos]);
      pos -= lsb(pos);
    }
    return ret;
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  vector<int> a(n + 2);
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  vector<int> dp(k + 2);
  dp[0] = 1;
  for (int i = 1; i <= n; ++i) {
    BIT new_dp(k);
    for (int j = 0; j <= k; ++j) {
      int l = j + 1;
      int r = j + min(a[i], k - j);
      new_dp.update(l, dp[j]);
      new_dp.update(r + 1, -dp[j]);
    }
    for (int j = 0; j <= k; ++j) {
      add(dp[j], new_dp.query(j));
    }
  }
  cout << dp[k] << '\n';
  return 0;
}
