#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T, class U>
using P = pair<T, U>;
template <class T>
using Heap = priority_queue<T>;
template <class T>
using heaP = priority_queue<T, vector<T>, greater<T>>;
template <class T, class U>
using umap = unordered_map<T, U>;
template <class T>
using uset = unordered_set<T>;
template <class T>
bool ChangeMax(T& a, const T& b) {
  if (a >= b) return false;
  a = b;
  return true;
}
template <class T>
bool ChangeMin(T& a, const T& b) {
  if (a <= b) return false;
  a = b;
  return true;
}
template <class T, size_t N, class U>
void Fill(T (&a)[N], const U& v) {
  fill((U*)a, (U*)(a + N), v);
}
template <class T>
istream& operator>>(istream& is, vector<T>& v) {
  for (auto& e : v) is >> e;
  return is;
}
template <long long mod>
class modint {
 private:
  long long num;
  long long extgcd(long long a, long long b, long long& x, long long& y) const {
    long long d = a;
    if (b != 0) {
      d = extgcd(b, a % b, y, x);
      y -= (a / b) * x;
    } else {
      x = 1;
      y = 0;
    }
    return d;
  }
  long long modinverse() const {
    long long x, y;
    extgcd(num, mod, x, y);
    return (mod + x % mod) % mod;
  }

 public:
  modint() : num(0) {}
  modint(const long long x) : num((x < 0 ? (x + mod) : x) % mod) {}
  friend modint operator+(const modint& a, const modint& b) {
    return modint(a.num + b.num);
  }
  friend modint operator-(const modint& a, const modint& b) {
    return modint(a.num - b.num);
  }
  friend modint operator*(const modint& a, const modint& b) {
    return modint(a.num * b.num);
  }
  friend modint operator/(const modint& a, const modint& b) {
    return modint(a * b.modinverse());
  }
  modint& operator+=(const modint& b) { return (*this) = (*this) + b; }
  modint& operator-=(const modint& b) { return (*this) = (*this) - b; }
  modint& operator*=(const modint& b) { return (*this) = (*this) * b; }
  modint& operator/=(const modint& b) { return (*this) = (*this) / b; }
  modint& operator++() {
    (*this) += 1;
    return (*this);
  }
  modint& operator--() {
    (*this) -= 1;
    return (*this);
  }
  modint operator++(int) {
    modint tmp(*this);
    ++(*this);
    return tmp;
  }
  modint operator--(int) {
    modint tmp(*this);
    --(*this);
    return tmp;
  }
  friend ostream& operator<<(ostream& os, const modint& a) {
    os << a.num;
    return os;
  }
  friend istream& operator>>(istream& is, modint& a) {
    long long x;
    is >> x;
    a = x;
    return is;
  }
};
int n, k;
vector<int> v;
using mint = modint<int(1e+9) + 7>;
mint dp(int i, int j) {
  static mint mm[101][100001];
  static bool used[101][100001];
  if (i == 0 && (j <= v[i] && j >= 0)) return 1;
  if (j < 0 || i < 0) return 0;
  if (used[i][j])
    return mm[i][j];
  else
    used[i][j] = true;
  for (int a = 0; a <= v[i]; ++a) mm[i][j] += dp(i - 1, j - a);
  return mm[i][j];
}
int main() {
  cin >> n >> k;
  v = vector<int>(n);
  cin >> v;
  cout << dp(n - 1, k) << endl;
  return 0;
}
