#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
typedef vector <ll> vi;                 // Vector of long long
typedef vector <vi> vvi;                // Vector of vi
typedef vector <pair<ll,ll>> vp;        // Vector of 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
#define ordered_set tree < ll ,  null_type ,  less<ll> ,  rb_tree_tag ,  tree_order_statistics_node_update >
// 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 MAXN 105
#define MAXK (ll) (1e5 + 5)
#define mod (ll) (1e9 + 7)

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

ll can(ll n, ll k)
{
    if (k < 0)
        return 0;
    
    if (n < 0)
    {
        if (k == 0)
            return 1;
        else
            return 0;
    }

    if (dp[n][k] == -1)
    {
        ll ans = 0;
        for (int i = 0; i <= arr[n]; i++)
            ans = (ans + (can(n - 1, k - i) % mod)) % mod;
        dp[n][k] = ans;
    }
    return dp[n][k];
}

int main(void)
{
    memset(dp, -1, sizeof(dp));
    ll n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++)
        cin >> arr[i];
    
    cout << can(n - 1, k) << "\n";
}