#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define initial first
#define added second
#define sort_all(v) sort(v.begin(), v.end())
#define ya_sayed_ya_badawy \
ios_base::sync_with_stdio(false); \
cin.tie(NULL);
const int MAX = 100 + 50;
const int MAX_N = 1e5 + 50;
int MOD = 1e9 + 7;
const int OO = 1e9;
const double EPS = (double)1e-9;
int add(ll a, ll b)
{
return ((a % MOD) + (b % MOD)) % MOD;
}
int mul(ll a, ll b)
{
return ((a % MOD) * (b % MOD)) % MOD;
}
int n, sum;
int v[MAX];
int mem[MAX][MAX_N];
int dp(int idx, int sum)
{
if(sum < 0)
{
return 0;
}
if (idx == n)
{
return (sum == 0);
}
int &ret = mem[idx][sum];
if (ret != -1)
{
return ret;
}
ret = 0;
for (int i = 0; i <= v[idx]; i++)
{
if (sum - i >= 0)
{
ret = add(ret, dp(idx + 1, sum - i));
}
}
return ret;
}
void solve()
{
cin >> n >> sum;
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
memset(mem, -1, sizeof(mem));
cout << dp(0, sum);
}
signed main()
{
ya_sayed_ya_badawy int t = 1;
// cin >> t;
while (t--)
{
solve();
// cout << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgaW5pdGlhbCBmaXJzdAojZGVmaW5lIGFkZGVkIHNlY29uZAojZGVmaW5lIHNvcnRfYWxsKHYpIHNvcnQodi5iZWdpbigpLCB2LmVuZCgpKQoKI2RlZmluZSB5YV9zYXllZF95YV9iYWRhd3kgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgXAogICAgY2luLnRpZShOVUxMKTsKCmNvbnN0IGludCBNQVggPSAxMDAgKyA1MDsKY29uc3QgaW50IE1BWF9OID0gMWU1ICsgNTA7CmludCBNT0QgPSAxZTkgKyA3Owpjb25zdCBpbnQgT08gPSAxZTk7CmNvbnN0IGRvdWJsZSBFUFMgPSAoZG91YmxlKTFlLTk7CgppbnQgYWRkKGxsIGEsIGxsIGIpCnsKICAgIHJldHVybiAoKGEgJSBNT0QpICsgKGIgJSBNT0QpKSAlIE1PRDsKfQoKaW50IG11bChsbCBhLCBsbCBiKQp7CiAgICByZXR1cm4gKChhICUgTU9EKSAqIChiICUgTU9EKSkgJSBNT0Q7Cn0KCmludCBuLCBzdW07CmludCB2W01BWF07CgppbnQgbWVtW01BWF1bTUFYX05dOwoKaW50IGRwKGludCBpZHgsIGludCBzdW0pCnsKCiAgICBpZihzdW0gPCAwKQogICAgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChpZHggPT0gbikKICAgIHsKICAgICAgICByZXR1cm4gKHN1bSA9PSAwKTsKICAgIH0KCiAgICBpbnQgJnJldCA9IG1lbVtpZHhdW3N1bV07CiAgICBpZiAocmV0ICE9IC0xKQogICAgewogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgcmV0ID0gMDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8PSB2W2lkeF07IGkrKykKICAgIHsKICAgICAgICBpZiAoc3VtIC0gaSA+PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gYWRkKHJldCwgZHAoaWR4ICsgMSwgc3VtIC0gaSkpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmV0Owp9Cgp2b2lkIHNvbHZlKCkKewoKICAgIGNpbiA+PiBuID4+IHN1bTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBjaW4gPj4gdltpXTsKICAgIH0KCiAgICBtZW1zZXQobWVtLCAtMSwgc2l6ZW9mKG1lbSkpOwoKICAgIGNvdXQgPDwgZHAoMCwgc3VtKTsKfQoKc2lnbmVkIG1haW4oKQp7CiAgICB5YV9zYXllZF95YV9iYWRhd3kgaW50IHQgPSAxOwogICAgLy8gY2luID4+IHQ7CgogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBzb2x2ZSgpOwogICAgICAgIC8vIGNvdXQgPDwgZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9