#include <bits/stdc++.h>
using namespace std::literals::string_literals;
using i64 = long long;
using std::cout;
using std::endl;
using std::cin;

template<typename T>
std::vector<T> make_v(size_t a){return std::vector<T>(a);}

template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts){
  return std::vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}

const int MOD = 1e9 + 7;

struct SegmentTree {
	std::vector<i64> seg;
	int sz = 1;
	
	SegmentTree(int n) {
		while(sz < n) sz <<= 1;
		seg.assign(sz * 2 - 1, 0);
	}
	void add(int a, int b, int k, int l, int r, i64 x) {
		if(b <= l || r <= a) return;
		if(a <= l && r <= b) {
			(seg[k] += x) %= MOD;
			return;
		}
		add(a, b, 2 * k + 1, l, (l + r) >> 1, x);
		add(a, b, 2 * k + 2, (l + r) >> 1, r, x);
	}
	void add(int a, int b, i64 x) {
		add(a, b, 0, 0, sz, x);
	}
	void set(int k, i64 x) {
		k += sz - 1;
		seg[k] = x;
	}
	i64 get(int k) {
		k += sz - 1;
		
		i64 ret = seg[k];
		while(k) {
			k = (k - 1) >> 1;
			
			(ret += seg[k]) %= MOD;
		}
		return ret;
	}
	i64 operator[](int k) {
		return seg[k + sz - 1];
	}
};

int main() {
	int n, k; scanf("%d%d", &n, &k); std::vector<int> a(n);
	for(int i = 0; i < n; i++) scanf("%d", &a[i]);
	
	std::vector<SegmentTree> dp(n + 1, SegmentTree(k + 1)); dp[0].set(0, 1);
	for(int i = 0; i < n; i++) {
		for(int j = 0; j <= k; j++) {
			int L = j, R = std::min(k + 1, j + a[i] + 1);
			dp[i + 1].add(L, R, dp[i].get(j));
		}
	}
	
	printf("%lld\n", dp[n].get(k));
	return 0;
}
