← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

const MOD int64 = 1000000007

var k int
var invFact int64

func powMod(a, b int64) int64 {
	res := int64(1)
	for b > 0 {
		if b&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		b >>= 1
	}
	return res
}

func comb(m int64) int64 {
	if m < 0 || m < int64(k) {
		return 0
	}
	res := int64(1)
	for i := 0; i < k; i++ {
		x := (m - int64(i)) % MOD
		if x < 0 {
			x += MOD
		}
		res = res * x % MOD
	}
	return res * invFact % MOD
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var n int
	var s int64
	fmt.Fscan(in, &n, &s)

	g := make([]int64, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &g[i])
		g[i]++
	}

	sort.Slice(g, func(i, j int) bool { return g[i] > g[j] })

	k = n - 1
	fact := int64(1)
	for i := 2; i <= k; i++ {
		fact = fact * int64(i) % MOD
	}
	invFact = powMod(fact, MOD-2)

	var ans int64
	var dfs func(int, int64, int)
	dfs = func(idx int, sum int64, parity int) {
		if sum > s {
			return
		}
		if idx == n {
			v := comb(s - sum + int64(k))
			if parity == 0 {
				ans += v
			} else {
				ans -= v
			}
			return
		}
		dfs(idx+1, sum, parity)
		dfs(idx+1, sum+g[idx], parity^1)
	}

	dfs(0, 0, 0)

	ans %= MOD
	if ans < 0 {
		ans += MOD
	}
	fmt.Fprintln(out, ans)
}