#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
template<typename T>
bool maximize(T& a, const T& b) {
if (b < a) return false;
a = b;
return true;
}
const int INF = 1e9;
const ll LINF = 1e18;
// dp knapsack
// Biến thể: mỗi món vật có thể được chọn nhiều lần
const int N = 1e2 + 5;
const int S = 1e6 + 5;
const int MOD = 1e9 + 7;
int n, s;
int w[N];
int dp[S]; // dp[i][j] = số cách chọn các món vật trong i món vật đầu tiên sao cho tổng = j
// 1 món có thể chọn nhiều lần
int memo[N][S];
int f(int i, int j) {
if (i == 0) {
if (j == 0) return 1;
return 0;
}
int& ans = memo[i][j];
if (ans != -1) return ans;
// không chọn món vật thứ i
ans = f(i - 1, j);
// chọn món vật thứ i
if (j - w[i] >= 0) (ans += f(i, j - w[i])) %= MOD;
return ans;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> s;
for (int i = 1; i <= n; i++) {
cin >> w[i];
}
dp[0] = 1;
// O(n * S)
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= s; j++) {
// chọn món vật thứ i
if (j - w[i] >= 0) {
(dp[j] += dp[j - w[i]]) %= MOD;
}
}
}
cout << dp[s] << '\n';
// memset(memo, -1, sizeof memo);
// cout << f(n, S) << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpib29sIG1heGltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChiIDwgYSkgcmV0dXJuIGZhbHNlOyAKCWEgPSBiOyAKCXJldHVybiB0cnVlOyAKfQoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKLy8gZHAga25hcHNhY2sKLy8gQmnhur9uIHRo4buDOiBt4buXaSBtw7NuIHbhuq10IGPDsyB0aOG7gyDEkcaw4bujYyBjaOG7jW4gbmhp4buBdSBs4bqnbgoKY29uc3QgaW50IE4gPSAxZTIgKyA1OyAKY29uc3QgaW50IFMgPSAxZTYgKyA1OyAgICAKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7IAoKaW50IG4sIHM7ICAKaW50IHdbTl07ICAKaW50IGRwW1NdOyAvLyBkcFtpXVtqXSA9IHPhu5EgY8OhY2ggY2jhu41uIGPDoWMgbcOzbiB24bqtdCB0cm9uZyBpIG3Ds24gduG6rXQgxJHhuqd1IHRpw6puIHNhbyBjaG8gdOG7lW5nID0gagogIAkJCSAgLy8gMSBtw7NuIGPDsyB0aOG7gyBjaOG7jW4gbmhp4buBdSBs4bqnbgkJICAgCgppbnQgbWVtb1tOXVtTXTsgCgppbnQgZihpbnQgaSwgaW50IGopIHsKCWlmIChpID09IDApIHsKCQlpZiAoaiA9PSAwKSByZXR1cm4gMTsgICAKCQlyZXR1cm4gMDsgCgl9CgoJaW50JiBhbnMgPSBtZW1vW2ldW2pdOyAgIAoJaWYgKGFucyAhPSAtMSkgcmV0dXJuIGFuczsgICAKCgkvLyBraMO0bmcgY2jhu41uIG3Ds24gduG6rXQgdGjhu6kgaQoJYW5zID0gZihpIC0gMSwgaik7ICAKCgkvLyBjaOG7jW4gbcOzbiB24bqtdCB0aOG7qSBpIAoJaWYgKGogLSB3W2ldID49IDApIChhbnMgKz0gZihpLCBqIC0gd1tpXSkpICU9IE1PRDsgCgoJcmV0dXJuIGFuczsgCn0JCgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyAgCQoJY2luID4+IG4gPj4gczsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY2luID4+IHdbaV07IAoJfSAKCglkcFswXSA9IDE7ICAgCgkvLyBPKG4gKiBTKQoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPD0gczsgaisrKSB7CgkJCS8vIGNo4buNbiBtw7NuIHbhuq10IHRo4bupIGkgIAoJCQlpZiAoaiAtIHdbaV0gPj0gMCkgewoJCQkJKGRwW2pdICs9IGRwW2ogLSB3W2ldXSkgJT0gTU9EOyAgCgkJCX0KCQl9Cgl9CgoJY291dCA8PCBkcFtzXSA8PCAnXG4nOyAKCgkvLyBtZW1zZXQobWVtbywgLTEsIHNpemVvZiBtZW1vKTsgICAKCgkvLyBjb3V0IDw8IGYobiwgUykgPDwgJ1xuJzsgCn0=