// // //// contribute to Mozilla 
// //      // https://bugzilla.mozilla.org/buglist.cgi?quicksearch=kw:student-project

// // /// what can i do for mozilla ?  just google this

// // //// contribute to thundrbird ..
// //      // https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Thunderbird_build

// // // basic things about git
// // // http://rogerdudler.github.io/git-guide/



// /// time is tough.....so don't stop ...keep learning ...keep growing :)

// #include <bits/stdc++.h>
// using namespace std ;
// typedef long long ll ;
// typedef long double ld ;
// const int N = 1e5+5 ;
// const int K = 50 ;
// const ll mod =  1e9+7 ;
// #define pb push_back
// #define ft first 
// #define sd second 
// #define IOS ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// ll poww(ll a,ll b){ll res=1;while(b){if(b&1){res*=a;}a=a*a;b>>=1;}return res;}
// ll poww(ll a,ll b,ll mod){ll res=1;while(b){if(b&1){res*=a;res%=mod;}a=a*a;a%=mod;b>>=1;}return res;}
// const int INF = 2e9 ;
// int n, c1, c2, c3;
// ld dp[305][305][305];
// ld f(int c1, int c2, int c3) {
//     if(c1 + c2 + c3 == 0) return 0.f;
//     ld &res = dp[c1][c2][c3]; 
//     if(abs(res+1.f)>1e-6)return res;
//     res = 1;
//     if(c1 > 0){
//         res += 1.0*c1 / n * f(c1 - 1, c2, c3);
//     }
//     if(c2 > 0) {
//         res += 1.0*c2 / n * f(c1 + 1, c2 - 1, c3); 
//     }
//     if(c3 > 0){
//         res += 1.0*c3 / n * f(c1, c2 + 1, c3 - 1);
//     }
//     res = res * n * 1.0/ (c1 + c2 + c3);
//     return res;
// }
// int main() {
//     cin >> n;
//     int x ;
//     for(int i=0;i<=300;i++){
//         for(int j=0;j<=300;j++){
//             for(int k=0;k<=300;k++) dp[i][j][k] = -1;
//         }
//     }
//     for(int i=1;i<=n;i++) {
//         cin >> x ;
//         if(x == 1)c1++;
//         else if(x == 2) c2++;
//         else if(x == 3) c3++; 
//     }
//     cout << fixed << setprecision(10) << f(c1,c2,c3) << '\n';
//     return 0;
// }

// // // https://atcoder.jp/contests/dp/tasks
// // // https://codeforces.com/contest/518/problem/D

// // // https://www.hackerearth.com/getstarted-opensource/



// // // // // // https://codeforces.com/problemset/problem/474/E
// // // // // // https://www.hackerrank.com/contests/codeagon/challenges/number-of-ways-1/problem
// // // // // // https://codeforces.com/contest/475/problem/D


// // // // https://www.spoj.com/problems/INS17M/
// // // // https://www.codechef.com/SEPT18B/problems/ANDSQR
// // // // 


// //// contribute to Mozilla 
//      // https://bugzilla.mozilla.org/buglist.cgi?quicksearch=kw:student-project

// /// what can i do for mozilla ?  just google this

// //// contribute to thundrbird ..
//      // https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Thunderbird_build

// // basic things about git
// // http://rogerdudler.github.io/git-guide/



// /// time is tough.....so don't stop ...keep learning ...keep growing :)

// // #include <bits/stdc++.h>
// // using namespace std ;
// // typedef long long ll ;
// // typedef long double ld ;
// // const int N = 1e5+5 ;
// // const int K = 50 ;
// // const ll mod =  1e9+7 ;
// // #define pb push_back
// // #define ft first 
// // #define sd second 
// // #define IOS ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// // ll poww(ll a,ll b){ll res=1;while(b){if(b&1){res*=a;}a=a*a;b>>=1;}return res;}
// // ll poww(ll a,ll b,ll mod){ll res=1;while(b){if(b&1){res*=a;res%=mod;}a=a*a;a%=mod;b>>=1;}return res;}
// // const int INF = 2e9 ;

// // map<ll, ll> F;
// // // ll fib[N+54];
// // // void pre(){
// // //     fib[0] = 1, fib[1] = 1;
// // //     for(int i=2;i<=N;i++){
// // //         fib[i] = fib[i-1]+fib[i-2];
// // //     }
// // // }
// // ll fib(ll n){
// //     int x = 1, y = 1, z = 0;
// //     for(int i=1;i<=n;i++) {
// //         z = (x + y)%mod ;
// //         x = y;
// //         y = z;
// //     }
// //     return z;
// // }
// // int main(){
// //    // freopen("~/Desktop/Problem D/Input Files/Input2.txt", stdout);
// //     //int t = 1e5 ;
// //     //pre();
// //     // for(int i=1;i<=20;i++) cout << fib[i] <<' '; 
// //     int t; cin >> t;
// //     while(t--) {
// //         ll n;
// //         cin >> n;
// //         ll p, q;
// //         if(n%2 == 0) {
// //             p = n / 2;
// //             q = (n + 1);
// //         }
// //         else {
// //             p =n ;
// //             q = (n + 1) / 2;
// //         }
// //         p %= mod; q %= mod;
// //         cout << (fib(n)-(p*q)%mod + mod )%mod<<'\n';
// //     }
// //     return 0;
// // }



/// time is tough.....so don't stop ...keep learning ...keep growing :)

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
typedef long double ld ;
const int N = 1e5+5 ;
const int K = 50 ;
const ll mod =  1e9+7 ;
#define pb push_back
#define ft first 
#define sd second 
#define IOS ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
ll poww(ll a,ll b){ll res=1;while(b){if(b&1){res*=a;}a=a*a;b>>=1;}return res;}
ll poww(ll a,ll b,ll mod){ll res=1;while(b){if(b&1){res*=a;res%=mod;}a=a*a;a%=mod;b>>=1;}return res;}
const int INF = 2e9 ;
int n, m, u, v, k;
ll dp[105][N], pre[105][N];
int a[105];
int main(){
    cin >> n >> k;
    // memset(cache, -1, sizeof cache);
    for(int i=1;i<=n;i++) {
        cin >> a[i];
    }
    pre[0][0] = 1;
    for(int i=1;i<=N-1;i++) pre[0][i] += pre[0][i-1];
    for(int i=1;i<=n;i++) {
        for(int j=0;j<=k;j++){
            int pos = max(0,j-a[i]);
            dp[i][j] = pre[i-1][j];
            if(pos != 0) dp[i][j] -= pre[i-1][pos-1];
            dp[i][j] += mod;
            dp[i][j] %= mod;
            pre[i][j] = dp[i][j];
            if(j > 0) pre[i][j] += pre[i][j-1];
            pre[i][j] %= mod;
        }
    }
    cout << dp[n][k] << '\n';
    return 0;
}
 

// https://atcoder.jp/contests/dp/tasks
// https://codeforces.com/contest/518/problem/D





// // // // https://codeforces.com/problemset/problem/474/E
// // // // https://www.hackerrank.com/contests/codeagon/challenges/number-of-ways-1/problem
// // // // https://codeforces.com/contest/475/problem/D


// // https://www.spoj.com/problems/INS17M/
// // https://www.codechef.com/SEPT18B/problems/ANDSQR
// // 


// int d[] = {1, 2, 2, 4, 5, 10, 15, 28, 45, 79, 129, 218, 356, 589, 959, 1569, 2548, 4145, 6720, 10901, 17656, 28602, 46302, 74959};

// ll C[100][100];

// void pre(){
//   for(int i=0;i<=99;i++) C[i][0] = 1;
//   for(int i=1;i<=99;i++) {
//     for(int j=0;j<=min(99,i);j++){
//       C[i][j] = (C[i-1][j-1] + C[i-1][j]) % mod ;
//     }
//   }
// }

// int main() {
//     pre();
//   int x =0, y = 1,z ;
//   for(int i=0;i<=23;i++) {
//     z = x + y ;
//     int p = i;
//     cout << z << ' ' ;
//     x = y ;
//     y = z ;
//   }
//   cout << "\n\n";
//     for(int i=2;i<=24;i++){
//       ll res = 0;
//       for(int j=0;j<=i;j++)
//       {
//         res += C[i][j]*C[i][j];
//         res %= mod;
//         if(j < i) {
//           res += C[i-j-1][j];
//           res %= mod;
//         }
//         res -= C[i+j-1][j];
//         res += mod;
//         res %= mod;
//         if(j < i-1) {
//           res += C[i-j-2][i];
//           res %= mod;
//         }
//       }
//       cout << res<< ' ' ;
//     }
//     cout << '\n';
//   return 0 ;
// }


Measured memory_bytes: 160000