#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
template <typename T>
void chkmax(T &x, T y) {
  x = max(x, y);
}
template <typename T>
void chkmin(T &x, T y) {
  x = min(x, y);
}
long long qpow(long long x, long long y, long long MOD) {
  long long a = 1;
  while (y) {
    if (y & 1) a = a * x % MOD;
    x = x * x % MOD;
    y >>= 1;
  }
  return a;
}
int n, k, a[N];
long long dp[N], c[N], val[N];
int lowbit(int x) { return x & -x; }
void add(int x, long long v) {
  val[x] += v;
  while (x <= k) {
    c[x] = (c[x] + v) % mod;
    x += lowbit(x);
  }
}
long long ask(int x) {
  long long ans = 0;
  while (x) {
    ans = (ans + c[x]) % mod;
    x -= lowbit(x);
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> k;
  ++k;
  for (int i = int(1); i <= int(n); ++i) cin >> a[i];
  add(1, 1);
  for (int i = int(1); i <= int(n); ++i) {
    for (int j = int(1); j <= int(k); ++j) {
      dp[j] = ask(j) - ask(max(0, j - a[i] - 1));
    }
    for (int j = int(1); j <= int(k); ++j) add(j, dp[j] - val[j]);
  }
  cout << dp[k];
  return 0;
}
