// author: Lien
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define sz(s) (int)(s).size()
#define all(x) begin(x), end(x)
#define trav(x, v) for (const auto &x : v)
using i64 = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpi = vector<pii>;
vi get_coef(const vi &a, int mod) {
// coef[sum(mask)] += sum(a(mask)) * (popcount(mask) % 2 == 1 ? 1 : -1)
// O(sum * N)
int sum = accumulate(all(a), 0);
vector<vi> dp(2, vi(sum + 1, 0));
dp[0][0] = 1;
trav(v, a) {
for (int s = sum; s >= v; --s) {
dp[0][s] += dp[1][s - v];
dp[1][s] += dp[0][s - v];
}
}
vi coef(sum, 0);
rep(s, 0, sum) {
coef[s] = (dp[1][s + 1] - dp[0][s + 1]) % mod;
if (coef[s] < 0) coef[s] += mod;
}
return coef;
}
vi get_f(const vi& a, int mod) {
// first sum(a_i) term [0, sum) = number of solutions for case [0..sum-1]
// O(sum * N)
int sum = accumulate(all(a), 0);
vi f(sum, 0);
f[0] = 1;
trav(v, a) {
rep(s, v, sum) {
f[s] += f[s - v];
if (f[s] >= mod) f[s] -= mod;
}
}
return f;
}
int get_mth(const vi &coef, const vi &f, i64 m, int mod) {
// Team Note of Deobureo Minkyu Party
// f[k] = f[k - 1] * coef[m - 1] + f[k - 2] * coef[m - 2] + .. + f[k - m] * coef[0]
// O(N^2 * logM), can improved to O(N * logN * logM) by using FFT
int n = sz(coef);
if (m < n) return f[(int)m];
vi s(n), t(n);
s[0] = 1;
if (n != 1) t[1] = 1;
else t[0] = coef[0];
auto mul = [&n, &coef, &mod](const vi &v, const vi &w) {
// todo: fft
vi t(2 * n);
rep(j, 0, n) rep(k, 0, n) {
t[j + k] += 1LL * v[j] * w[k] % mod;
if (t[j + k] >= mod) t[j + k] -= mod;
}
for (int j = 2 * n - 1; j >= n; --j)
for (int k = 1; k <= n; ++k) {
t[j - k] += 1LL * t[j] * coef[k - 1] % mod;
if (t[j - k] >= mod) t[j - k] -= mod;
}
t.resize(n);
return t;
};
for (; m > 0; m >>= 1) {
if (m & 1) s = mul(s, t);
t = mul(t, t);
}
i64 ret = 0;
rep(i, 0, n) ret += 1LL * s[i] * f[i] % mod;
return ret % mod;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
i64 m;
cin >> n >> m;
vi a(n);
for (auto &v : a) cin >> v;
constexpr int MOD = int(1e9) + 7;
vi coef = get_coef(a, MOD);
vi f = get_f(a, MOD);
cout << get_mth(coef, f, m, MOD) << '\n';
return 0;
}
// 3 * x_0 + 3 * x_1 + 6 * x_2 + 11 * x_3 = 100000
// a = {3, 3, 6, 11} -> n = 4
// m = 10^5
// answer = 587812715
Ly8gYXV0aG9yOiBMaWVuCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSByZXAoaSwgYSwgYikgZm9yIChpbnQgaSA9IGE7IGkgPCAoYik7ICsraSkKI2RlZmluZSBzeihzKSAoaW50KShzKS5zaXplKCkKI2RlZmluZSBhbGwoeCkgYmVnaW4oeCksIGVuZCh4KQojZGVmaW5lIHRyYXYoeCwgdikgZm9yIChjb25zdCBhdXRvICZ4IDogdikKCnVzaW5nIGk2NCA9IGxvbmcgbG9uZzsKdXNpbmcgdmkgPSB2ZWN0b3I8aW50PjsKdXNpbmcgcGlpID0gcGFpcjxpbnQsIGludD47CnVzaW5nIHZwaSA9IHZlY3RvcjxwaWk+OwoKdmkgZ2V0X2NvZWYoY29uc3QgdmkgJmEsIGludCBtb2QpIHsKICAgIC8vIGNvZWZbc3VtKG1hc2spXSArPSBzdW0oYShtYXNrKSkgKiAocG9wY291bnQobWFzaykgJSAyID09IDEgPyAxIDogLTEpCiAgICAvLyBPKHN1bSAqIE4pCiAgICBpbnQgc3VtID0gYWNjdW11bGF0ZShhbGwoYSksIDApOwogICAgdmVjdG9yPHZpPiBkcCgyLCB2aShzdW0gKyAxLCAwKSk7CiAgICBkcFswXVswXSA9IDE7CiAgICB0cmF2KHYsIGEpIHsKICAgICAgICBmb3IgKGludCBzID0gc3VtOyBzID49IHY7IC0tcykgewogICAgICAgICAgICBkcFswXVtzXSArPSBkcFsxXVtzIC0gdl07CiAgICAgICAgICAgIGRwWzFdW3NdICs9IGRwWzBdW3MgLSB2XTsKICAgICAgICB9CiAgICB9CiAgICB2aSBjb2VmKHN1bSwgMCk7CiAgICByZXAocywgMCwgc3VtKSB7CiAgICAgICAgY29lZltzXSA9IChkcFsxXVtzICsgMV0gLSBkcFswXVtzICsgMV0pICUgbW9kOwogICAgICAgIGlmIChjb2VmW3NdIDwgMCkgY29lZltzXSArPSBtb2Q7CiAgICB9CiAgICByZXR1cm4gY29lZjsKfQoKdmkgZ2V0X2YoY29uc3QgdmkmIGEsIGludCBtb2QpIHsKICAgIC8vIGZpcnN0IHN1bShhX2kpIHRlcm0gWzAsIHN1bSkgPSBudW1iZXIgb2Ygc29sdXRpb25zIGZvciBjYXNlIFswLi5zdW0tMV0KICAgIC8vIE8oc3VtICogTikKICAgIGludCBzdW0gPSBhY2N1bXVsYXRlKGFsbChhKSwgMCk7CiAgICB2aSBmKHN1bSwgMCk7CiAgICBmWzBdID0gMTsKICAgIHRyYXYodiwgYSkgewogICAgICAgIHJlcChzLCB2LCBzdW0pIHsKICAgICAgICAgICAgZltzXSArPSBmW3MgLSB2XTsKICAgICAgICAgICAgaWYgKGZbc10gPj0gbW9kKSBmW3NdIC09IG1vZDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZjsKfQoKaW50IGdldF9tdGgoY29uc3QgdmkgJmNvZWYsIGNvbnN0IHZpICZmLCBpNjQgbSwgaW50IG1vZCkgewogICAgLy8gVGVhbSBOb3RlIG9mIERlb2J1cmVvIE1pbmt5dSBQYXJ0eQogICAgLy8gZltrXSA9IGZbayAtIDFdICogY29lZlttIC0gMV0gKyBmW2sgLSAyXSAqIGNvZWZbbSAtIDJdICsgLi4gKyBmW2sgLSBtXSAqIGNvZWZbMF0KICAgIC8vIE8oTl4yICogbG9nTSksIGNhbiBpbXByb3ZlZCB0byBPKE4gKiBsb2dOICogbG9nTSkgYnkgdXNpbmcgRkZUCiAgICBpbnQgbiA9IHN6KGNvZWYpOwogICAgaWYgKG0gPCBuKSByZXR1cm4gZlsoaW50KW1dOwogICAgdmkgcyhuKSwgdChuKTsKICAgIHNbMF0gPSAxOwogICAgaWYgKG4gIT0gMSkgdFsxXSA9IDE7CiAgICBlbHNlIHRbMF0gPSBjb2VmWzBdOwoKICAgIGF1dG8gbXVsID0gWyZuLCAmY29lZiwgJm1vZF0oY29uc3QgdmkgJnYsIGNvbnN0IHZpICZ3KSB7CiAgICAgICAgLy8gdG9kbzogZmZ0CiAgICAgICAgdmkgdCgyICogbik7CiAgICAgICAgcmVwKGosIDAsIG4pIHJlcChrLCAwLCBuKSB7CiAgICAgICAgICAgIHRbaiArIGtdICs9IDFMTCAqIHZbal0gKiB3W2tdICUgbW9kOwogICAgICAgICAgICBpZiAodFtqICsga10gPj0gbW9kKSB0W2ogKyBrXSAtPSBtb2Q7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGogPSAyICogbiAtIDE7IGogPj0gbjsgLS1qKQogICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDw9IG47ICsraykgewogICAgICAgICAgICB0W2ogLSBrXSArPSAxTEwgKiB0W2pdICogY29lZltrIC0gMV0gJSBtb2Q7CiAgICAgICAgICAgIGlmICh0W2ogLSBrXSA+PSBtb2QpIHRbaiAtIGtdIC09IG1vZDsKICAgICAgICB9CiAgICAgICAgdC5yZXNpemUobik7CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9OwoKICAgIGZvciAoOyBtID4gMDsgbSA+Pj0gMSkgewogICAgICAgIGlmIChtICYgMSkgcyA9IG11bChzLCB0KTsKICAgICAgICB0ID0gbXVsKHQsIHQpOwogICAgfQoKICAgIGk2NCByZXQgPSAwOwogICAgcmVwKGksIDAsIG4pIHJldCArPSAxTEwgKiBzW2ldICogZltpXSAlIG1vZDsKICAgIHJldHVybiByZXQgJSBtb2Q7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKCiAgICBpbnQgbjsKICAgIGk2NCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIHZpIGEobik7CiAgICBmb3IgKGF1dG8gJnYgOiBhKSBjaW4gPj4gdjsKCiAgICBjb25zdGV4cHIgaW50IE1PRCA9IGludCgxZTkpICsgNzsKICAgIHZpIGNvZWYgPSBnZXRfY29lZihhLCBNT0QpOwogICAgdmkgZiA9IGdldF9mKGEsIE1PRCk7CiAgICBjb3V0IDw8IGdldF9tdGgoY29lZiwgZiwgbSwgTU9EKSA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0KCi8vIDMgKiB4XzAgKyAzICogeF8xICsgNiAqIHhfMiArIDExICogeF8zID0gMTAwMDAwCi8vIGEgPSB7MywgMywgNiwgMTF9IC0+IG4gPSA0Ci8vIG0gPSAxMF41Ci8vIGFuc3dlciA9IDU4NzgxMjcxNQ==