← Home
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, k int
	fmt.Fscan(reader, &n, &k)

	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	const maxDiff = 45 
	const offset = maxDiff
	const numDiffs = maxDiff*2 + 1
	
	dp := make([]int, numDiffs*(k+1))
	nextDp := make([]int, numDiffs*(k+1))

	dp[offset*(k+1)+0] = 1

	for j := 0; j < n; j++ {
		x := a[j]
		
		for i := 0; i < len(nextDp); i++ {
			nextDp[i] = 0
		}

		for diff := -maxDiff; diff <= maxDiff; diff++ {
			diffOffset := diff + offset
			baseIdx := diffOffset * (k + 1)
			
			for dist := 0; dist <= k; dist++ {
				val := dp[baseIdx+dist]
				if val == 0 {
					continue
				}

				for y := 0; y <= 1; y++ {
					newDiff := diff + y - x
					if newDiff < -maxDiff || newDiff > maxDiff {
						continue
					}
					
					absDiff := newDiff
					if absDiff < 0 {
						absDiff = -absDiff
					}
					
					newDist := dist + absDiff
					if newDist <= k {
						nIdx := (newDiff + offset) * (k + 1) + newDist
						nextDp[nIdx] += val
						if nextDp[nIdx] >= 1000000007 {
							nextDp[nIdx] -= 1000000007
						}
					}
				}
			}
		}
		
		dp, nextDp = nextDp, dp
	}

	ans := 0
	baseIdx := offset * (k + 1)
	for d := 0; d <= k; d++ {
		if (k-d)%2 == 0 {
			ans += dp[baseIdx+d]
			if ans >= 1000000007 {
				ans -= 1000000007
			}
		}
	}

	fmt.Println(ans)
}