package main
import (
"fmt"
)
const Mod = 1e9+7
func main() {
a := 0
b := 0
for {
n, _ := fmt.Scan(&a, &b)
if n == 0 {
break
} else {
coins := make([]int, a)
for i:=0; i<a; i++ {
fmt.Scan(&coins[i])
}
fmt.Printf("%d\n", process(coins, b, 0))
}
}
}
func process(coins []int, aim int, index int) int {
if len(coins) == 0 || aim < 0{
return 0
}
dp := make([][]int, len(coins)+1)
for i:=0; i<len(dp); i++ {
dp[i] = make([]int, aim+1)
dp[i][0] = 1
}
dp[len(coins)][0] = 1
for i:=len(dp)-2; i>=0; i-- {
for j:=1; j<=aim; j++ {
// for k:=0; k*coins[i] <= j; k++ {
// dp[i][j] += dp[i+1][j-k*coins[i]]
// dp[i][j] = dp[i][j]%Mod
// }
// 枚举行为可以进一步优化
// eg 假设某个位置dp[i][j],需要依次枚举 0-k次
// dp[i][j] k = 0时,依赖 dp[i+1][j] 处的值
// dp[i][j] k > 0时, 可以认为只依赖 dp[i][j-coins[i]] 处的值(前提不越界
dp[i][j] = (dp[i+1][j])
if j>=coins[i] {
dp[i][j] += (dp[i][j-coins[i]])
}
dp[i][j] = dp[i][j]%Mod
}
}
return dp[0][aim]
}