#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
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;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int n, s;
int w[N];
int dp[N][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 main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> s;
for (int i = 1; i <= n; i++) cin >> w[i];
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= s; j++) {
// Bỏ qua món vật thứ i
add(dp[i][j], dp[i - 1][j]);
// Chọn món vật thứ i
if (j >= w[i]) add(dp[i][j], dp[i][j - w[i]]);
}
} // O(n * s)
cout << dp[n][s] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKLy8gZHAga25hcHNhY2sKLy8gQmnhur9uIHRo4buDOiBt4buXaSBtw7NuIHbhuq10IGPDsyB0aOG7gyDEkcaw4bujYyBjaOG7jW4gbmhp4buBdSBs4bqnbgoKY29uc3QgaW50IE4gPSAxZTIgKyA1OyAKY29uc3QgaW50IFMgPSAxZTYgKyA1OyAgICAKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7IAoKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSArPSBiOyAKCWlmIChhID49IE1PRCkgYSAtPSBNT0Q7IAp9CgppbnQgbiwgczsgIAppbnQgd1tOXTsgIAppbnQgZHBbTl1bU107IC8vIGRwW2ldW2pdID0gU+G7kSBjw6FjaCBjaOG7jW4gY8OhYyBtw7NuIHbhuq10IHRyb25nIGkgbcOzbiB24bqtdCDEkeG6p3UgdGnDqm4gc2FvIGNobyB04buVbmcgPSBqCiAgCQkgICAgICAvLyAgICAgICAgICAgICgxIG3Ds24gY8OzIHRo4buDIGNo4buNbiBuaGnhu4F1IGzhuqduKQkJICAgCgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAgCQoJY2luID4+IG4gPj4gczsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gd1tpXTsgCgoJZHBbMF1bMF0gPSAxOyAgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPD0gczsgaisrKSB7CgkJCS8vIELhu48gcXVhIG3Ds24gduG6rXQgdGjhu6kgaQoJCQlhZGQoZHBbaV1bal0sIGRwW2kgLSAxXVtqXSk7CgkJCS8vIENo4buNbiBtw7NuIHbhuq10IHRo4bupIGkgIAoJCQlpZiAoaiA+PSB3W2ldKSBhZGQoZHBbaV1bal0sIGRwW2ldW2ogLSB3W2ldXSk7CgkJfQoJfSAvLyBPKG4gKiBzKQoKCWNvdXQgPDwgZHBbbl1bc10gPDwgJ1xuJzsgIAp9