#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;

const int maxn = 101;
const int maxk = 100001;
ModInt dp[maxn][maxk];

// i番目以降の人にk個のアメを配る、という状態を考えてDPをする。
// ただ、愚直にDPをするとO(Nk^2)になるのでTLEしてしまう。
// なので、遷移式を式変形してループを含まない形にする。
// やり方は等比数列の一般項の求め方みたいな感じに、dp[i][k] と dp[i][k-1]を考える。
// dp[i][k] - dp[i][k-1] をやるとキャンセルしまくって真ん中らへんの項が消えてくれる。
int main() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    rep(i, n) cin >> a[i];
    rep(i, n+1) dp[i][0] = 1;
    for(int i = n - 1; i >= 0; i--) {
        for(int j = 1; j <= k; j++) {
            // 元の式：dp[i][j] = dp[i+1][j] + dp[i+1][j-1] +...+ dp[i+1][j-a[i]]
            // dp[i][j] - dp[i][j-1] = (dp[i+1][j] + dp[i+1][j-1] +...+ dp[i+1][j-a[i]]) -
            //                         (dp[i+1][j-1] + dp[i+1][j-2] +...+ dp[i+1][j-a[i]] + dp[i+1][j-a[i]-1])
            // dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-a[i]-1]
            dp[i][j] = dp[i][j - 1] + dp[i + 1][j];
            if (j - a[i] - 1 >= 0) dp[i][j] -= dp[i + 1][j - a[i] - 1];
        }
    }
    cout << dp[0][k] << endl;
    return 0;
}
