Problem:
Score : 100 points

Problem Statement

There are N children, numbered 1, 2, \ldots, N.

They have decided to share K candies among themselves.
Here, for each i (1 \leq i \leq N), Child i must receive between 0 and a_i candies (inclusive).
Also, no candies should be left over.

Find the number of ways for them to share candies, modulo 10^9 + 7.
Here, two ways are said to be different when there exists a child who receives a different number of candies.

Constraints

All values in input are integers.

1 \leq N \leq 100

0 \leq K \leq 10^5

0 \leq a_i \leq K

Input

Input is given from Standard Input in the following format:

N K
a_1 a_2 \ldots a_N

Output

Print the number of ways for the children to share candies, modulo 10^9 + 7.

Sample Input 1

3 4
1 2 3

Sample Output 1

5

There are five ways for the children to share candies, as follows:

(0, 1, 3)

(0, 2, 2)

(1, 0, 3)

(1, 1, 2)

(1, 2, 1)

Here, in each sequence, the i-th element represents the number of candies that Child i receives.

Sample Input 2

1 10
9

Sample Output 2

0

There may be no ways for the children to share candies.

Sample Input 3

2 0
0 0

Sample Output 3

1

There is one way for the children to share candies, as follows:

(0, 0)

Sample Input 4

4 100000
100000 100000 100000 100000

Sample Output 4

665683269

Be sure to print the answer modulo 10^9 + 7.

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
using namespace std;
#define int long long int
#define endl "\n"
#define F first
#define S second
#define mod 1000000007
#define pb push_back
#define FOR(i,a,n) for(int i=a;i<n;i++)
#define REV(i,a,n) for(int i=a;i>=n;i--)
#define all(a) a.begin(),a.end()
#define UB upper_bound
#define LB lower_bound
const int NUM = 2e5 + 5;
int dp[100][NUM];
// dp[x][y]  = no of ways of distributing y candies till position x
/* bases Cases
    dp[x][0] = 1 // at any position not giving candy to someone
    dp[0][y] = 1
    dp[x][y] = dp[x-1][y] + dp[x-1][y-1] + dp[x-1][y-2] + .. + dp[x-1][y-a[x]] 
*/
int a[100],n,k;
int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int num_tests=1; 
    //cin >> num_tests;
    while(num_tests-->0){
        cin >> n >> k;
        FOR(i,0,n){
            cin >> a[i];
        }
        FOR(i,0,a[0]+1)
            dp[0][i] = 1;
        FOR(i,1,n){
            vector<int> ps(k+1,0);
            ps[0] = dp[i-1][0];
            FOR(j,1,k+1)
                ps[j] = (ps[j-1] + dp[i-1][j]) % mod;
            FOR(j,0,k+1){
                if(j > a[i])
                    dp[i][j] = (ps[j] - ps[j-a[i]-1] + mod) % mod;
                else 
                    dp[i][j] = ps[j];
            }
        }
        cout << dp[n-1][k];
    }   
}