#include <bits/stdc++.h>
const int MOD = 1e9 + 7;
using namespace std;
int n, K;
vector<int> v;
vector<int> dp(100005, 0);
vector<int> segtree(4e5 + 5);
int add(int a, int b) {
  int n = a + b;
  if (n >= MOD) n -= MOD;
  return n;
}
void build(int v, int l, int r) {
  if (l == r) {
    segtree[v] = dp[l];
    return;
  }
  int mid = (l + r) / 2;
  build(2 * v, l, mid);
  build(2 * v + 1, mid + 1, r);
  segtree[v] = add(segtree[2 * v], segtree[2 * v + 1]);
}
int query(int v, int l, int r, int ql, int qr) {
  if (r < ql || l > qr) return 0;
  if (ql <= l && r <= qr) return segtree[v];
  int mid = (l + r) / 2;
  return add(query(2 * v, l, mid, ql, qr),
             query(2 * v + 1, mid + 1, r, ql, qr));
}
void update(int v, int l, int r, int idx) {
  if (l == r) {
    segtree[v] = dp[l];
    return;
  }
  int mid = (l + r) / 2;
  if (idx <= mid)
    update(2 * v, l, mid, idx);
  else
    update(2 * v + 1, mid + 1, r, idx);
  segtree[v] = add(segtree[2 * v], segtree[2 * v + 1]);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> K;
  v.resize(n);
  for (int &a : v) cin >> a;
  dp[0] = 1;
  build(1, 0, K);
  for (int child : v) {
    for (int k = 1; k <= K; ++k) {
      dp[k] = query(1, 0, K, max(k - child, 0), k);
    }
    for (int k = 1; k <= K; ++k) update(1, 0, K, k);
  }
  cout << dp[K];
}
