Link to this code:
https://cses.fi/paste/dee27f25dbbc815cc647ab//* 777 */
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
const int MOD = 1e9 + 7;
int add(int a, int b) { return (a + b) % MOD; }
// int dp[110][1000010];
int dp[1000010];
int n, target_sum;
vector<int> vec;
/* top down
// form 1
int rec(int level, int rem_sum) {
if (rem_sum == 0) return 1;
if (level == n) return 0;
int cnt = rec(level + 1, rem_sum);
if (vec[level] <= rem_sum) cnt = add(cnt, rec(level, rem_sum - vec[level]));
return cnt;
}
void solve() {
cin >> n >> target_sum;
vec.resize(n);
for (auto& x : vec) cin >> x;
int res = rec(0, target_sum);
cout << res << '\n';
}
*/
/* bottom up
void solve() {
cin >> n >> target_sum;
vec.resize(n);
for (auto& x : vec) cin >> x;
dp[n][0] = 1;
for (int level = n - 1 ; level >= 0 ; --level) {
dp[level][0] = 1;
for (int rem_sum = 1 ; rem_sum <= target_sum ; ++rem_sum) {
dp[level][rem_sum] = dp[level + 1][rem_sum];
if (vec[level] <= rem_sum) dp[level][rem_sum] = add(dp[level][rem_sum], dp[level][rem_sum - vec[level]]);
}
}
cout << dp[0][target_sum];
}
*/
void solve() {
cin >> n >> target_sum;
vec.resize(n);
for (auto& x : vec) cin >> x;
dp[0] = 1;
for (int level = n - 1 ; level >= 0 ; --level) {
for (int rem_sum = vec[level] ; rem_sum <= target_sum ; ++rem_sum) {
dp[rem_sum] = add(dp[rem_sum], dp[rem_sum - vec[level]]);
}
}
cout << dp[target_sum];
}
int32_t main() {
FAST_IO
solve();
}