#include<bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define vpl vector<pair<ll,ll>>
#define vll vector<ll>
#define vvl vector<vector<ll>>
#define speed ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define ison(x,k) ((x)&(1ll<<k))
#define onit(x,k) (x=(x|(1ll<<k)))
#define ofit(x,k) (x=(x^((1ll<<k))))
#define hbit(e,x) (e=(64ll)-__builtin_clzll(x))
#define mod (ll)(1e9+7)
#define oo 0x3f3f3f3f3f3f3f3f
#define endl "\n"
const ll N = 1e5 + 7;
using namespace std;
using namespace chrono;
ll n, k;
int dp[101][N];
vll v;
vll pre;
ll go(ll i,ll j) {
if (i == n) {
if (j == 0) return 1;
else return 0;
}
if (j == 0) return 1;
if (~dp[i][j]) return dp[i][j];
ll ch2 = 0;
ll sum = pre[n - 1] - (i ? pre[i - 1] : 0);
ll o = j - sum;
if (o > 0) return 0;
for (ll k1 = 0; k1 <= min(v[i], j); k1++) {
ch2 += go(i + 1, j - k1);
if (ch2 >= mod) ch2 -= mod;
}
return dp[i][j] = (ch2) % mod;
}
void solve(int tttt) {
cin >> n >> k;
memset(dp, -1, sizeof(dp));
for (ll i = 0; i < n; i++) {
ll x;
cin >> x;
v.push_back(x);
}
pre = v;
for (ll i = 1; i < v.size(); i++) {
pre[i] = pre[i - 1] + pre[i];
}
cout << go(0, k) << endl;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r",stdin);
freopen("output.txt", "w",stdout);
freopen("time.txt", "w",stderr);
#endif
auto start = high_resolution_clock::now();
speed;
ll TC = 1; //cin>>TC;
for (int i = 1; i <= TC; i++) solve(i);
auto end = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(end - start);
cerr << "time = " << duration.count() << " ms" << endl;
auto duration_sec = duration_cast<seconds>(end - start);
cerr << "time = " << duration_sec.count() << " s" << endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBmZiBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAojZGVmaW5lIHZwbCB2ZWN0b3I8cGFpcjxsbCxsbD4+CiNkZWZpbmUgdmxsIHZlY3RvcjxsbD4KI2RlZmluZSB2dmwgdmVjdG9yPHZlY3RvcjxsbD4+CiNkZWZpbmUgc3BlZWQgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7Y2luLnRpZShudWxscHRyKTtjb3V0LnRpZShudWxscHRyKTsKI2RlZmluZSBpc29uKHgsaykgKCh4KSYoMWxsPDxrKSkKI2RlZmluZSBvbml0KHgsaykgKHg9KHh8KDFsbDw8aykpKQojZGVmaW5lIG9maXQoeCxrKSAoeD0oeF4oKDFsbDw8aykpKSkKI2RlZmluZSBoYml0KGUseCkgIChlPSg2NGxsKS1fX2J1aWx0aW5fY2x6bGwoeCkpCiNkZWZpbmUgbW9kIChsbCkoMWU5KzcpCiNkZWZpbmUgb28gMHgzZjNmM2YzZjNmM2YzZjNmCiNkZWZpbmUgZW5kbCAiXG4iCmNvbnN0IGxsIE4gPSAxZTUgKyA3Owp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgY2hyb25vOwpsbCBuLCBrOwppbnQgZHBbMTAxXVtOXTsKdmxsIHY7CnZsbCBwcmU7CmxsIGdvKGxsIGksbGwgaikgewogICAgaWYgKGkgPT0gbikgewogICAgICAgIGlmIChqID09IDApIHJldHVybiAxOwogICAgICAgIGVsc2UgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoaiA9PSAwKSByZXR1cm4gMTsKICAgIGlmICh+ZHBbaV1bal0pIHJldHVybiBkcFtpXVtqXTsKICAgIGxsIGNoMiA9IDA7CiAgICBsbCBzdW0gPSBwcmVbbiAtIDFdIC0gKGkgPyBwcmVbaSAtIDFdIDogMCk7CiAgICBsbCBvID0gaiAtIHN1bTsKICAgIGlmIChvID4gMCkgcmV0dXJuIDA7CiAgICBmb3IgKGxsIGsxID0gMDsgazEgPD0gbWluKHZbaV0sIGopOyBrMSsrKSB7CiAgICAgICAgY2gyICs9IGdvKGkgKyAxLCBqIC0gazEpOwogICAgICAgIGlmIChjaDIgPj0gbW9kKSBjaDIgLT0gbW9kOwogICAgfQogICAgcmV0dXJuIGRwW2ldW2pdID0gKGNoMikgJSBtb2Q7Cn0KCnZvaWQgc29sdmUoaW50IHR0dHQpIHsKICAgIGNpbiA+PiBuID4+IGs7CiAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YoZHApKTsKICAgIGZvciAobGwgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBsbCB4OwogICAgICAgIGNpbiA+PiB4OwogICAgICAgIHYucHVzaF9iYWNrKHgpOwogICAgfQogICAgcHJlID0gdjsKICAgIGZvciAobGwgaSA9IDE7IGkgPCB2LnNpemUoKTsgaSsrKSB7CiAgICAgICAgcHJlW2ldID0gcHJlW2kgLSAxXSArIHByZVtpXTsKICAgIH0KICAgIGNvdXQgPDwgZ28oMCwgaykgPDwgZW5kbDsKfQoKaW50IG1haW4oKSB7CiNpZm5kZWYgT05MSU5FX0pVREdFCiAgICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsc3RkaW4pOwogICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3IixzdGRvdXQpOwogICAgZnJlb3BlbigidGltZS50eHQiLCAidyIsc3RkZXJyKTsKI2VuZGlmCiAgICBhdXRvIHN0YXJ0ID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHNwZWVkOwogICAgbGwgVEMgPSAxOyAvL2Npbj4+VEM7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBUQzsgaSsrKSBzb2x2ZShpKTsKICAgIGF1dG8gZW5kID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGF1dG8gZHVyYXRpb24gPSBkdXJhdGlvbl9jYXN0PG1pbGxpc2Vjb25kcz4oZW5kIC0gc3RhcnQpOwogICAgY2VyciA8PCAidGltZSA9ICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiIG1zIiA8PCBlbmRsOwogICAgYXV0byBkdXJhdGlvbl9zZWMgPSBkdXJhdGlvbl9jYXN0PHNlY29uZHM+KGVuZCAtIHN0YXJ0KTsKICAgIGNlcnIgPDwgInRpbWUgPSAiIDw8IGR1cmF0aW9uX3NlYy5jb3VudCgpIDw8ICIgcyIgPDwgZW5kbDsKfQo=