#include <bits/stdc++.h>
using namespace std;
#define print(a) \
for (auto x : a) \
cout << x << " "; \
cout << endl
#define print_upto(a, n) \
for (int i = 0; i < n; i++) \
cout << a[i] << " "; \
cout << endl
#define take(x, n) \
for (int i = 0; i < n; i++) \
cin >> x[i];
#define watch(x) cout << (#x) << " is " << (x) << "\n"
#define watch2(x, y) cout << (#x) << " is " << (x) << " and " << (#y) << " is " << (y) << "\n"
#define watch3(x, y, z) cout << (#x) << " is " << (x) << " and " << (#y) << " is " << (y) << " and " << (#z) << " is " << (z) << "\n"
#define ll long long
#define ff first
#define ss second
#define null NULL
#define all(c) (c).begin(), (c).end()
#define nl "\n"
#define ld long double
#define eb emplace_back
#define pb push_back
#define pf push_front
#define mod 1000000007
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<ll, ll> pll;
typedef map<ll, ll> mll;
ll n, x;
ll a[105];
ll f(ll i, ll sum, vector<vector<ll>> &dp)
{
if (sum == x)
return 1;
else if (sum > x || i == n + 1)
return 0;
if (dp[i][sum] != -1)
return dp[i][sum];
ll ans = 0;
ans = (ans + f(i, sum + a[i], dp)) % mod;
ans = (ans + f(i + 1, sum, dp)) % mod;
return dp[i][sum] = ans;
}
int main()
{
// Use ctrl+shift+b ( second option )
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t = 1;
// cin >> t;
while (t--)
{
cin >> n >> x;
for (ll i = 1; i <= n; i++)
{
cin >> a[i];
}
vector<vector<ll>> dp(n + 1, vector<ll>(x + 1, -1));
cout << f(1, 0, dp) << nl;
}
return 0;
}
// #include <bits/stdc++.h>
// using namespace std;
// int main()
// {
// int mod = 1e9 + 7;
// int n, target;
// cin >> n >> target;
// vector<int> x(n);
// for (int &v : x)
// cin >> v;
// vector<vector<int>> dp(n + 1, vector<int>(target + 1, 0));
// dp[0][0] = 1;
// for (int i = 1; i <= n; i++)
// {
// for (int j = 0; j <= target; j++)
// {
// dp[i][j] = dp[i - 1][j];
// int left = j - x[i - 1];
// if (left >= 0)
// {
// (dp[i][j] += dp[i][left]) %= mod;
// }
// }
// }
// cout << dp[n][target] << endl;
// }
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHByaW50KGEpICAgICAgICAgIFwKICAgIGZvciAoYXV0byB4IDogYSkgICAgICBcCiAgICAgICAgY291dCA8PCB4IDw8ICIgIjsgXAogICAgY291dCA8PCBlbmRsCiNkZWZpbmUgcHJpbnRfdXB0byhhLCBuKSAgICAgICAgXAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIFwKICAgICAgICBjb3V0IDw8IGFbaV0gPDwgIiAiOyAgICBcCiAgICBjb3V0IDw8IGVuZGwKI2RlZmluZSB0YWtlKHgsIG4pICAgICAgICAgICAgICBcCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgXAogICAgICAgIGNpbiA+PiB4W2ldOwoKI2RlZmluZSB3YXRjaCh4KSBjb3V0IDw8ICgjeCkgPDwgIiBpcyAiIDw8ICh4KSA8PCAiXG4iCiNkZWZpbmUgd2F0Y2gyKHgsIHkpIGNvdXQgPDwgKCN4KSA8PCAiIGlzICIgPDwgKHgpIDw8ICIgYW5kICIgPDwgKCN5KSA8PCAiIGlzICIgPDwgKHkpIDw8ICJcbiIKI2RlZmluZSB3YXRjaDMoeCwgeSwgeikgY291dCA8PCAoI3gpIDw8ICIgaXMgIiA8PCAoeCkgPDwgIiBhbmQgIiA8PCAoI3kpIDw8ICIgaXMgIiA8PCAoeSkgPDwgIiBhbmQgIiA8PCAoI3opIDw8ICIgaXMgIiA8PCAoeikgPDwgIlxuIgoKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBmZiBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAojZGVmaW5lIG51bGwgTlVMTAojZGVmaW5lIGFsbChjKSAoYykuYmVnaW4oKSwgKGMpLmVuZCgpCiNkZWZpbmUgbmwgIlxuIgoKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIHBmIHB1c2hfZnJvbnQKI2RlZmluZSBtb2QgMTAwMDAwMDAwNwoKdHlwZWRlZiB2ZWN0b3I8bGw+IHZsOwp0eXBlZGVmIHZlY3Rvcjx2bD4gdnZsOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgbWFwPGxsLCBsbD4gbWxsOwoKbGwgbiwgeDsKbGwgYVsxMDVdOwoKbGwgZihsbCBpLCBsbCBzdW0sIHZlY3Rvcjx2ZWN0b3I8bGw+PiAmZHApCnsKICAgIGlmIChzdW0gPT0geCkKICAgICAgICByZXR1cm4gMTsKICAgIGVsc2UgaWYgKHN1bSA+IHggfHwgaSA9PSBuICsgMSkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAoZHBbaV1bc3VtXSAhPSAtMSkKICAgICAgICByZXR1cm4gZHBbaV1bc3VtXTsKCiAgICBsbCBhbnMgPSAwOwogICAgYW5zID0gKGFucyArIGYoaSwgc3VtICsgYVtpXSwgZHApKSAlIG1vZDsKICAgIGFucyA9IChhbnMgKyBmKGkgKyAxLCBzdW0sIGRwKSkgJSBtb2Q7CgogICAgcmV0dXJuIGRwW2ldW3N1bV0gPSBhbnM7Cn0KCmludCBtYWluKCkKewoKICAgIC8vIFVzZSBjdHJsK3NoaWZ0K2IgKCBzZWNvbmQgb3B0aW9uICkKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwoKICAgIGxsIHQgPSAxOwogICAgLy8gY2luID4+IHQ7CgogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBjaW4gPj4gbiA+PiB4OwoKICAgICAgICBmb3IgKGxsIGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGNpbiA+PiBhW2ldOwogICAgICAgIH0KCiAgICAgICAgdmVjdG9yPHZlY3RvcjxsbD4+IGRwKG4gKyAxLCB2ZWN0b3I8bGw+KHggKyAxLCAtMSkpOwoKICAgICAgICBjb3V0IDw8IGYoMSwgMCwgZHApIDw8IG5sOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovLyAjaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KLy8gdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIGludCBtYWluKCkKLy8gewovLyAgICAgaW50IG1vZCA9IDFlOSArIDc7Ci8vICAgICBpbnQgbiwgdGFyZ2V0OwovLyAgICAgY2luID4+IG4gPj4gdGFyZ2V0OwovLyAgICAgdmVjdG9yPGludD4geChuKTsKLy8gICAgIGZvciAoaW50ICZ2IDogeCkKLy8gICAgICAgICBjaW4gPj4gdjsKCi8vICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGRwKG4gKyAxLCB2ZWN0b3I8aW50Pih0YXJnZXQgKyAxLCAwKSk7Ci8vICAgICBkcFswXVswXSA9IDE7Ci8vICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCi8vICAgICB7Ci8vICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gdGFyZ2V0OyBqKyspCi8vICAgICAgICAgewovLyAgICAgICAgICAgICBkcFtpXVtqXSA9IGRwW2kgLSAxXVtqXTsKLy8gICAgICAgICAgICAgaW50IGxlZnQgPSBqIC0geFtpIC0gMV07Ci8vICAgICAgICAgICAgIGlmIChsZWZ0ID49IDApCi8vICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgIChkcFtpXVtqXSArPSBkcFtpXVtsZWZ0XSkgJT0gbW9kOwovLyAgICAgICAgICAgICB9Ci8vICAgICAgICAgfQovLyAgICAgfQovLyAgICAgY291dCA8PCBkcFtuXVt0YXJnZXRdIDw8IGVuZGw7Ci8vIH0=