#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 sub(ll a, ll b)
{
return ((a % MOD) - (b % MOD) + MOD) % MOD;
}
int mul(ll a, ll b)
{
return ((a % MOD) * (b % MOD)) % MOD;
}
int dp[100 + 50][100000 + 50];
void solve()
{
int n, sum;
cin >> n >> sum;
int v[MAX];
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
dp[n][0] = 1;
for (int idx = n - 1; idx >= 0; idx--)
{
int prefix[sum + 2] = {};
for (int s = 0; s <= sum; s++)
{
prefix[s] = dp[idx + 1][s];
if (s != 0)
{
prefix[s] = add(prefix[s], prefix[s - 1]);
}
}
for (int s = 0; s <= sum; s++)
{
int from = s - v[idx];
int to = s;
dp[idx][s] = prefix[to];
if (from >= 1)
{
dp[idx][s] = sub(dp[idx][s], prefix[from - 1]);
}
}
}
cout << dp[0][sum];
}
signed main()
{
ya_sayed_ya_badawy int t = 1;
// cin >> t;
while (t--)
{
solve();
// cout << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgaW5pdGlhbCBmaXJzdAojZGVmaW5lIGFkZGVkIHNlY29uZAojZGVmaW5lIHNvcnRfYWxsKHYpIHNvcnQodi5iZWdpbigpLCB2LmVuZCgpKQoKI2RlZmluZSB5YV9zYXllZF95YV9iYWRhd3kgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgXAogICAgY2luLnRpZShOVUxMKTsKCmNvbnN0IGludCBNQVggPSAxMDAgKyA1MDsKY29uc3QgaW50IE1BWF9OID0gMWU1ICsgNTA7CmludCBNT0QgPSAxZTkgKyA3Owpjb25zdCBpbnQgT08gPSAxZTk7CmNvbnN0IGRvdWJsZSBFUFMgPSAoZG91YmxlKTFlLTk7CgppbnQgYWRkKGxsIGEsIGxsIGIpCnsKICAgIHJldHVybiAoKGEgJSBNT0QpICsgKGIgJSBNT0QpKSAlIE1PRDsKfQoKaW50IHN1YihsbCBhLCBsbCBiKQp7CiAgICByZXR1cm4gKChhICUgTU9EKSAtIChiICUgTU9EKSArIE1PRCkgJSBNT0Q7Cn0KCmludCBtdWwobGwgYSwgbGwgYikKewogICAgcmV0dXJuICgoYSAlIE1PRCkgKiAoYiAlIE1PRCkpICUgTU9EOwp9CgppbnQgZHBbMTAwICsgNTBdWzEwMDAwMCArIDUwXTsKCnZvaWQgc29sdmUoKQp7CgogICAgaW50IG4sIHN1bTsKICAgIGNpbiA+PiBuID4+IHN1bTsKCiAgICBpbnQgdltNQVhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgY2luID4+IHZbaV07CiAgICB9CgogICAgZHBbbl1bMF0gPSAxOwoKICAgIGZvciAoaW50IGlkeCA9IG4gLSAxOyBpZHggPj0gMDsgaWR4LS0pCiAgICB7CgogICAgICAgIGludCBwcmVmaXhbc3VtICsgMl0gPSB7fTsKCiAgICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPD0gc3VtOyBzKyspCiAgICAgICAgewogICAgICAgICAgICBwcmVmaXhbc10gPSBkcFtpZHggKyAxXVtzXTsKICAgICAgICAgICAgaWYgKHMgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJlZml4W3NdID0gYWRkKHByZWZpeFtzXSwgcHJlZml4W3MgLSAxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaW50IHMgPSAwOyBzIDw9IHN1bTsgcysrKQogICAgICAgIHsKCiAgICAgICAgICAgIGludCBmcm9tID0gcyAtIHZbaWR4XTsKICAgICAgICAgICAgaW50IHRvID0gczsKCiAgICAgICAgICAgIGRwW2lkeF1bc10gPSBwcmVmaXhbdG9dOwogICAgICAgICAgICBpZiAoZnJvbSA+PSAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkcFtpZHhdW3NdID0gc3ViKGRwW2lkeF1bc10sIHByZWZpeFtmcm9tIC0gMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgZHBbMF1bc3VtXTsKfQoKc2lnbmVkIG1haW4oKQp7CiAgICB5YV9zYXllZF95YV9iYWRhd3kgaW50IHQgPSAxOwogICAgLy8gY2luID4+IHQ7CgogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBzb2x2ZSgpOwogICAgICAgIC8vIGNvdXQgPDwgZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9