/*
Hey there, I love you. :D
Yansoon.......
*/
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define all(o) o.begin(), o.end()
#define rall(o) o.rbegin(), o.rend()
#define setIO(name) \
freopen(name ".in", "r", stdin); \
freopen(name ".out", "w", stdout)
#ifdef DEBUG
#include "debug.hpp"
#else
#define debug(...)
#define debug_itr(...)
#define debug_bits(...)
#define debug_pq(...)
#define debug_q(...)
#endif
using namespace std;
const ull MOD = 1e9 + 7;
const double PI = 3.14159265358979323846;
void file()
{
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
}
ull power(ull b, ull p, ull m)
{
if (p == 0) return 1;
ull sq = power(b, p / 2, m);
sq = sq * sq;
if (p%2 == 1)
sq = sq*b;
sq %= m;
return sq;
}
ull Combinations(ull n, ull r) {
if (r > n - r) r = n - r; // Use the smaller value for efficiency
ull result = 1;
for (ull i = 1; i <= r; i++) {
result = result * (n - i + 1) / i;
}
return result;
}
ll gcd(ll a,ll b)
{
if (b == 0) return a;
return gcd(b, a%b);
}
const ll mod = (ll)1e9 + 7;
ll dp[1000005];
int n, x;
ll c[105];
ll ac(ll sum)
{
if (sum > x) return 0;
else if(sum == x) return 1;
ll &ret = dp[sum];
if (ret != -1) return ret;
ll ans = 0;
for (int i = 0;i < n;i++)
{
ans += ac(sum + c[i]);
ans %= mod;
}
return ret = ans;
}
void solve()
{
memset(dp, -1, sizeof(dp));
cin >> n >> x;
for (int i = 0; i < n;i++)
cin >> c[i];
ll ans = ac(0);
cout << ans << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
file();
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
LyoKSGV5IHRoZXJlLCBJIGxvdmUgeW91LiA6RCAKCllhbnNvb24uLi4uLi4uCiovCgoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwojZGVmaW5lIGFsbChvKSBvLmJlZ2luKCksIG8uZW5kKCkKI2RlZmluZSByYWxsKG8pIG8ucmJlZ2luKCksIG8ucmVuZCgpCiNkZWZpbmUgc2V0SU8obmFtZSkgICAgICAgICAgICAgICAgICBcCiAgICBmcmVvcGVuKG5hbWUgIi5pbiIsICJyIiwgc3RkaW4pOyBcCiAgICBmcmVvcGVuKG5hbWUgIi5vdXQiLCAidyIsIHN0ZG91dCkKCiNpZmRlZiBERUJVRwojaW5jbHVkZSAiZGVidWcuaHBwIgojZWxzZQojZGVmaW5lIGRlYnVnKC4uLikKI2RlZmluZSBkZWJ1Z19pdHIoLi4uKQojZGVmaW5lIGRlYnVnX2JpdHMoLi4uKQojZGVmaW5lIGRlYnVnX3BxKC4uLikKI2RlZmluZSBkZWJ1Z19xKC4uLikKI2VuZGlmCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgdWxsIE1PRCA9IDFlOSArIDc7CmNvbnN0IGRvdWJsZSBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7Cgp2b2lkIGZpbGUoKQp7CiNpZmRlZiBERUJVRwogICAgZnJlb3BlbigiaW4udHh0IiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJvdXQudHh0IiwgInciLCBzdGRvdXQpOwojZW5kaWYKfQoKdWxsIHBvd2VyKHVsbCBiLCB1bGwgcCwgdWxsIG0pCnsKICAgIGlmIChwID09IDApIHJldHVybiAxOwogICAgdWxsIHNxID0gcG93ZXIoYiwgcCAvIDIsIG0pOwogICAgc3EgPSBzcSAqIHNxOwoKICAgIGlmIChwJTIgPT0gMSkKICAgICAgICBzcSA9ICBzcSpiOwogICAgc3EgJT0gbTsKICAgIHJldHVybiBzcTsKfQp1bGwgQ29tYmluYXRpb25zKHVsbCBuLCB1bGwgcikgewogICAgaWYgKHIgPiBuIC0gcikgciA9IG4gLSByOyAvLyBVc2UgdGhlIHNtYWxsZXIgdmFsdWUgZm9yIGVmZmljaWVuY3kKCiAgICB1bGwgcmVzdWx0ID0gMTsKICAgIGZvciAodWxsIGkgPSAxOyBpIDw9IHI7IGkrKykgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIChuIC0gaSArIDEpIC8gaTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CmxsIGdjZChsbCBhLGxsIGIpCnsKICAgIGlmIChiID09IDApIHJldHVybiBhOwogICAgCiAgICByZXR1cm4gZ2NkKGIsIGElYik7Cn0KY29uc3QgbGwgbW9kID0gKGxsKTFlOSArIDc7CmxsIGRwWzEwMDAwMDVdOwppbnQgbiwgeDsKbGwgY1sxMDVdOwpsbCBhYyhsbCBzdW0pCnsKICAgIGlmIChzdW0gPiB4KSByZXR1cm4gMDsKICAgIGVsc2UgaWYoc3VtID09IHgpIHJldHVybiAxOwoKICAgIGxsICZyZXQgPSBkcFtzdW1dOwoKICAgIGlmIChyZXQgIT0gLTEpIHJldHVybiByZXQ7CgogICAgbGwgYW5zID0gMDsKICAgIGZvciAoaW50IGkgPSAwO2kgPCBuO2krKykKICAgIHsKICAgICAgICBhbnMgKz0gYWMoc3VtICsgY1tpXSk7CiAgICAgICAgYW5zICU9IG1vZDsKICAgIH0KICAgIHJldHVybiByZXQgPSBhbnM7Cn0Kdm9pZCBzb2x2ZSgpCnsKICAgIG1lbXNldChkcCwgLTEsIHNpemVvZihkcCkpOwogICAgY2luID4+IG4gPj4geDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjtpKyspCiAgICAgICAgY2luID4+IGNbaV07CiAgICAKICAgIGxsIGFucyA9IGFjKDApOwogICAgY291dCA8PCBhbnMgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBmaWxlKCk7CiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pCiAgICAgICAgc29sdmUoKTsKICAgIHJldHVybiAwOwp9