//--------------------------------------------------
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,abm,mmx,avx,avx2,popcnt,fma")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("Ofast")
//--------------------------------------------------
#include <bits/stdc++.h>
#include <chrono>
#include <set>
#include <map>
#include <deque>
#include <cmath>
#include <queue>
#include <cassert>
#include <random>
#include <bitset>
#include <iomanip>
#include <numeric>
#include <time.h>
#include <ctime>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <fstream>
#include <stack>
#include <cstring>
//--------------------------------------------------
#define forn(i, n) for(int i = 0; i < n; i++)
#define forw(i, n) for(int i = n-1; i >= 0; --i)
#define forns(i, n, s) for(int i = s; i < n; i++)
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define all(v) v.begin(),v.end()
#define allr(v) v.rbegin(),v.rend()
//----------------------------------------------------
using namespace std;
//----------------------------------------------------
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef long double ld;
typedef vector<ll> lnum;
typedef complex<ld> comp;
//----------------------------------------------------
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;
const ll inf = 1e18;
const int base = 1e9;
const ld PI = 3.1415926;
//----------------------------------------------------
//#define endl '\n';
#ifdef MY_DEBUG
void deb(ld x) { cerr << x << endl; };
#else
void deb(ld x){};
#endif
//----------------------------------------------------
//----------------------------------------------------
int n, k, a[100];
ll dp[100][100*1001];
//----------------------------------------------------
unsigned int bitcount(ull val) { return __builtin_popcount(val) + __builtin_popcount(val >> 32); }

void local() {
    freopen("test.in", "r", stdin);
}

void remote() {
}

void read() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> n >> k;
    forn(i, n) cin >> a[i];
}


int main() {
#ifdef MY_DEBUG
    local();
#else
    remote();
#endif
    read();

    /*
     * Очевидно можно дать любое кол-во допустимых конфет 1-му ребёнку 1-м способом
     * */
    forn(i, k+1) dp[0][i] = (i <= a[0] ? 1 : 0);
    forns(i, n, 1){
        /*
         * Считаем префиксные суммы по прошлому дп, используя этот же массив, т.к.
         * он больше нам не пригодится сам.
         * Префиксные суммы нужны для того, чтобы переходить в текущего чела, отдавая ему
         * от 0 до a[i] конфет
         * */
        forns(j, k+1, 1) dp[i-1][j] = (dp[i-1][j] + dp[i-1][j-1]) % mod;
        
        /*
         * Т.е. соблюдая условия задачи мы можем распределить j конфет между i+1 челами путём того,
         * что отдадим i-му челу от 0 до a[i] конфет и добавим способы распределить оставшиеся j-a[i] 
         * между i челами
         * */
        forn(j, k+1) dp[i][j] = (j-a[i]-1 >= 0 ? (dp[i-1][j] - dp[i-1][j-a[i]-1] + mod)% mod : dp[i-1][j]);
    }

    cout << dp[n-1][k] << endl;
}

Measured memory_bytes: 78464