# -*- coding: utf-8 -*-



import sys
from functools import reduce



def input(): return sys.stdin.readline().strip()

def ceil(a, b=1): return int(-(-a // b))

def round(x): return int((x*2+1) // 2)

def fermat(x, y, MOD): return x * pow(y, MOD-2, MOD) % MOD

def lcm(x, y): return (x * y) // gcd(x, y)

def lcm_list(nums): return reduce(lcm, nums, 1)

def gcd_list(nums): return reduce(gcd, nums, nums[0])

def INT(): return int(eval(input()))

def MAP(): return list(map(int, input().split()))

def LIST(): return list(map(int, input().split()))

sys.setrecursionlimit(10 ** 9)

INF = float('inf')

MOD = 10 ** 9 + 7



N, K = MAP()

aN = LIST()



# dp[この子までの範囲で][飴を配る総数] = 場合の数

dp = [[0] * (K+1) for i in range(N+1)]

# 0番目まで(誰もいない)の範囲で0個配る場合の数は1通り

dp[0][0] = 1



for i in range(N):

    sm = [0] * (K+2)

    # 今回送るi行について累積和を取る

    for j in range(1, K+2):

        sm[j] = sm[j-1] + dp[i][j-1]

        sm[j] %= MOD

    for j in range(K+1):

        # iが送る予定の長さに応じた区間和を取る

        dp[i+1][j] = sm[j+1] - sm[max(j-aN[i], 0)]

        dp[i+1][j] %= MOD

        # for k in range(aN[i]+1):

        #     dp[i+1][j+k] += dp[i][j]

print((dp[N][K]))

# -*- coding: utf-8 -*-



import sys

import numpy as np
from functools import reduce



def input(): return sys.stdin.readline().strip()

def ceil(a, b=1): return int(-(-a // b))

def round(x): return int((x*2+1) // 2)

def fermat(x, y, MOD): return x * pow(y, MOD-2, MOD) % MOD

def lcm(x, y): return (x * y) // gcd(x, y)

def lcm_list(nums): return reduce(lcm, nums, 1)

def gcd_list(nums): return reduce(gcd, nums, nums[0])

def INT(): return int(eval(input()))

def MAP(): return list(map(int, input().split()))

def LIST(): return list(map(int, input().split()))

sys.setrecursionlimit(10 ** 9)

INF = float('inf')

MOD = 10 ** 9 + 7



N, K = MAP()

A = LIST()



# dp[この子までの範囲で][飴を配る総数] = 場合の数

dp = np.zeros((N+1, K+1), dtype=np.int64)

# 0番目まで(誰もいない)の範囲で0個配る場合の数は1通り

dp[0,0] = 1



for i, a in enumerate(A):

    # 今回のiを次の遷移させる区間の始点としてまとめて追加

    dp[i+1] = dp[i]

    # 今回のiをa+1個ずらして、遷移させる区間の終点としてまとめて追加

    dp[i+1,a+1:] -= dp[i,:-(a+1)]

    # 累積和すれば、元の状態からそれぞれa個先まで遷移させた状態になる

    # (区間の始点・終点の記録→累積和の流れはimos的な感じ)

    np.cumsum(dp[i+1], out=dp[i+1])

    dp[i+1] %= MOD



print((dp[N][K]))

# -*- coding: utf-8 -*-
import sys
from functools import reduce


def input():
    return sys.stdin.readline().strip()


def ceil(a, b=1):
    return int(-(-a // b))


def round(x):
    return int((x * 2 + 1) // 2)


def fermat(x, y, MOD):
    return x * pow(y, MOD - 2, MOD) % MOD


def lcm(x, y):
    return (x * y) // gcd(x, y)


def lcm_list(nums):
    return reduce(lcm, nums, 1)


def gcd_list(nums):
    return reduce(gcd, nums, nums[0])


def INT():
    return int(eval(input()))


def MAP():
    return list(map(int, input().split()))


def LIST():
    return list(map(int, input().split()))


sys.setrecursionlimit(10**9)
INF = float("inf")
MOD = 10**9 + 7
N, K = MAP()
aN = LIST()
# dp[この子までの範囲で][飴を配る総数] = 場合の数
dp = [[0] * (K + 1) for i in range(N + 1)]
# 0番目まで(誰もいない)の範囲で0個配る場合の数は1通り
dp[0][0] = 1
for i in range(N):
    sm = [0] * (K + 2)
    # 今回送るi行について累積和を取る
    for j in range(1, K + 2):
        sm[j] = sm[j - 1] + dp[i][j - 1]
        sm[j] %= MOD
    for j in range(K + 1):
        # iが送る予定の長さに応じた区間和を取る
        dp[i + 1][j] = sm[j + 1] - sm[max(j - aN[i], 0)]
        dp[i + 1][j] %= MOD
        # for k in range(aN[i]+1):
        #     dp[i+1][j+k] += dp[i][j]
print((dp[N][K]))

# -*- coding: utf-8 -*-
import sys
import numpy as np
from functools import reduce


def input():
    return sys.stdin.readline().strip()


def ceil(a, b=1):
    return int(-(-a // b))


def round(x):
    return int((x * 2 + 1) // 2)


def fermat(x, y, MOD):
    return x * pow(y, MOD - 2, MOD) % MOD


def lcm(x, y):
    return (x * y) // gcd(x, y)


def lcm_list(nums):
    return reduce(lcm, nums, 1)


def gcd_list(nums):
    return reduce(gcd, nums, nums[0])


def INT():
    return int(eval(input()))


def MAP():
    return list(map(int, input().split()))


def LIST():
    return list(map(int, input().split()))


sys.setrecursionlimit(10**9)
INF = float("inf")
MOD = 10**9 + 7
N, K = MAP()
A = LIST()
# dp[この子までの範囲で][飴を配る総数] = 場合の数
dp = np.zeros((N + 1, K + 1), dtype=np.int64)
# 0番目まで(誰もいない)の範囲で0個配る場合の数は1通り
dp[0, 0] = 1
for i, a in enumerate(A):
    # 今回のiを次の遷移させる区間の始点としてまとめて追加
    dp[i + 1] = dp[i]
    # 今回のiをa+1個ずらして、遷移させる区間の終点としてまとめて追加
    dp[i + 1, a + 1 :] -= dp[i, : -(a + 1)]
    # 累積和すれば、元の状態からそれぞれa個先まで遷移させた状態になる
    # (区間の始点・終点の記録→累積和の流れはimos的な感じ)
    np.cumsum(dp[i + 1], out=dp[i + 1])
    dp[i + 1] %= MOD
print((dp[N][K]))

+import numpy as np -aN = LIST() +A = LIST() -dp = [[0] * (K + 1) for i in range(N + 1)] +dp = np.zeros((N + 1, K + 1), dtype=np.int64) -dp[0][0] = 1 -for i in range(N): -    sm = [0] * (K + 2) -    # 今回送るi行について累積和を取る -    for j in range(1, K + 2): -        sm[j] = sm[j - 1] + dp[i][j - 1] -        sm[j] %= MOD -    for j in range(K + 1): -        # iが送る予定の長さに応じた区間和を取る -        dp[i + 1][j] = sm[j + 1] - sm[max(j - aN[i], 0)] -        dp[i + 1][j] %= MOD -        # for k in range(aN[i]+1): -        #     dp[i+1][j+k] += dp[i][j] +dp[0, 0] = 1 +for i, a in enumerate(A): +    # 今回のiを次の遷移させる区間の始点としてまとめて追加 +    dp[i + 1] = dp[i] +    # 今回のiをa+1個ずらして、遷移させる区間の終点としてまとめて追加 +    dp[i + 1, a + 1 :] -= dp[i, : -(a + 1)] +    # 累積和すれば、元の状態からそれぞれa個先まで遷移させた状態になる +    # (区間の始点・終点の記録→累積和の流れはimos的な感じ) +    np.cumsum(dp[i + 1], out=dp[i + 1]) +    dp[i + 1] %= MOD