#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;

#define ll long long
#define ld long double
typedef vector <ll> vi;                 // Vector of long long
typedef vector <vi> vvi;                // Vector of vi
typedef vector <pair<ll,ll>> ii;        // Vector of pairs
#define ff first                        // For pairs
#define ss second                       // For pairs
#define sz(a) int((a).size())           // Function to determine size of any container
#define pb push_back                    // Pushback to vector
#define mp make_pair                    // Makes pairs to be stored as pair
#define all(c) (c).begin(), (c).end()   // Mainly used by me in sorting
// ordered_set adds two new functions to set - (set).find_by_order([kth element based on zero indexing]) and order_of_key()
// order_of_key returns number of elements less that parameter. If element exists, that order is its index
#define ordered_set tree < ll ,  null_type ,  less<ll> ,  rb_tree_tag ,  tree_order_statistics_node_update >
#define MAXK (ll)((1e5 * 3) + 5)
#define MAXN (ll)(1e2 + 10)
#define MOD (ll)(1e9 + 7)

#define mod(a) (((a % MOD) + MOD) % MOD)

ll dp[MAXN][MAXK];
ll n;
vi arr;

int main(void)
{
    memset(dp, 0, sizeof(dp));
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    ll k;
    cin >> n >> k;
    arr.resize(n);
    for (int i = 0; i < n; i++)
        cin >> arr[i];    

    for (int i = k; i >= 0; i--)
            if (k - i <= arr[0])
                dp[0][i] = mod(dp[0][i + 1] + 1);
            else
                dp[0][i] = dp[0][i + 1];
        
    for (int i = 1; i < n; i++)
        for (int j = k; j >= 0; j--)
            dp[i][j] =  mod(dp[i][j + 1] + mod(dp[i - 1][j] - dp[i - 1][j + arr[i] + 1]));

    cout << dp[n - 1][0] - dp[n - 1][1] << "\n";
}