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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define ll long long

#define cc 1000000007

int main()
{
	ll N,K; //N no of children
	cin>>N>>K;
	 ll arr[N];  ll dp[N+1][K+1];
	 ll f=K+1;ll g=N+1; ll presum[N+1][K+1];
	 memset(dp, 0, sizeof(dp[0][0]) * g * f);
       memset(presum, 0, sizeof(presum[0][0]) * g * f); 	 
	 

	 for(ll i=0;i<N;i++)
	 { cin>>arr[i];}
	 
	 for(ll i=0;i<=K;i++)
	 {
	 	if(arr[0]>=i)
		 {dp[1][i]=1;}
		 
		 if(i==0)
		 {presum[1][i]=dp[1][i];}
		 
		 else
		 {
		 	presum[1][i]=presum[1][i-1]%cc+dp[1][i]%cc;
		 }
	 }
	 

 for(ll p=2;p<=N;p++)
{
	for(ll candy=0;candy<=K;candy++)
	{
		if(candy<=arr[p-1])
		{
			dp[p][candy]=(dp[p][candy]%cc+presum[p-1][candy]%cc)%cc;
			
		}
		else
		{
			dp[p][candy]=(dp[p][candy]%cc+presum[p-1][candy]%cc-presum[p-1][candy-1-arr[p-1]]%cc)%cc;
		}
		
			if(candy>=1)
			{
			presum[p][candy]=(dp[p][candy]%cc+presum[p][candy-1]%cc)%cc;
		    }
		    else
		    {
		    	presum[p][candy]=dp[p][candy];	
			}
	}

}
cout<<(dp[N][K]+cc)%cc<<endl;	 
	 
	
	 
}