#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const long long MOD = 1e9 + 7;
double EPS = 1e-8;
const int sqrtN = 350;
const int MAX_N = sqrtN * sqrtN + 1;
using TYPE = long long;
const TYPE DFLT = 0;
inline void f1(TYPE& a, const TYPE& b) {
  (a += b);
  if (a >= MOD) a -= MOD;
}
inline void f2(TYPE& a, const TYPE& b) {
  (a += b);
  if (a >= MOD) a -= MOD;
}
TYPE dat[MAX_N];
TYPE ans[sqrtN];
TYPE lazy[sqrtN];
inline int get_i(int x) { return x / sqrtN; }
inline int get_j(int x) { return x % sqrtN; }
inline int get_idx(int i, int j) { return i * sqrtN + j; }
void calcLazy(int i) {
  for (int j = (0); j < (int)(sqrtN); j++) {
    f1(dat[get_idx(i, j)], lazy[i]);
  }
  lazy[i] = 0;
}
void add(int l, int r, TYPE s) {
  for (int i = (get_i(l)); i < (int)(sqrtN); i++) {
    int x = get_idx(i, 0), y = x + sqrtN;
    if (r <= x) break;
    if (l <= x && y <= r) {
      f1(ans[i], s);
      f1(lazy[i], s);
    } else {
      calcLazy(i);
      for (int idx = (max(x, l)); idx < (int)(min(y, r)); idx++) {
        f1(dat[idx], s);
      }
      for (int j = (0); j < (int)(sqrtN); j++) {
        f2(ans[i], dat[get_idx(i, j)]);
      }
    }
  }
}
TYPE query(int l, int r) {
  TYPE ret = DFLT;
  for (int i = (get_i(l)); i < (int)(sqrtN); i++) {
    int x = get_idx(i, 0), y = x + sqrtN;
    if (r <= x) break;
    if (l <= x && y <= r) {
      f2(ret, ans[i]);
    } else {
      calcLazy(i);
      for (int idx = (max(x, l)); idx < (int)(min(y, r)); idx++) {
        f2(ret, dat[idx]);
      }
    }
  }
  return ret;
}
int main() {
  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  for (int i = (0); i < (int)(n); i++) cin >> a[i];
  add(0, 1, 1LL);
  for (int i = (0); i < (int)(n); i++) {
    for (int l = k; l >= 0; --l) {
      auto x = query(l, l + 1);
      add(l + 1, l + a[i] + 1, x);
    }
  }
  cout << query(k, k + 1) << endl;
  return 0;
}
