#include <bits/stdc++.h>
using namespace std;
 
const int MOD = 1'000'000'007;
 
long long modpow(long long a, long long e){
    long long r = 1;
    while(e){
        if(e & 1) r = r * a % MOD;
        a = a * a % MOD;
        e >>= 1;
    }
    return r;
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int N, K;
    if(!(cin >> N >> K)) return 0;
    vector<int> x(N);
    for (int i = 0; i < N; ++i) cin >> x[i];
 
    // factorials up to K
    vector<long long> fact(K+1), invfact(K+1);
    fact[0] = 1;
    for (int i = 1; i <= K; ++i) fact[i] = fact[i-1]*i % MOD;
    invfact[K] = modpow(fact[K], MOD-2);
    for (int i = K; i >= 1; --i) invfact[i-1] = invfact[i]*i % MOD;
 
    // DP convolution
    vector<long long> dp(K+1, 0), ndp(K+1, 0);
    dp[0] = 1;
 
    for (int i = 0; i < N; ++i) {
        fill(ndp.begin(), ndp.end(), 0);
 
        // S_i[t]: số cách cho viên i dùng đúng t lượt (không tính đứng yên)
        vector<long long> Si(K+1, 0);
        for (int t = abs(x[i]); t <= K; ++t) {
            if ( ((t - x[i]) & 1) == 0 ) { // t ≡ x_i (mod 2)
                int a = (t + x[i]) / 2;
                int b = (t - x[i]) / 2;
                if (a >= 0 && b >= 0)
                    Si[t] = invfact[a] * invfact[b] % MOD;
            }
        }
 
        for (int s = 0; s <= K; ++s) if (dp[s]) {
            for (int t = 0; s + t <= K; ++t) if (Si[t]) {
                ndp[s + t] = (ndp[s + t] + dp[s] * Si[t]) % MOD;
            }
        }
        dp.swap(ndp);
    }
 
    // Thêm lượt "đứng yên" và sắp xếp K lượt: nhân P(K, t) = K! / (K-t)!
    long long ans = 0;
    for (int t = 0; t <= K; ++t) {
        if (dp[t] == 0) continue;
        long long ways_place = fact[K] * invfact[K - t] % MOD;
        ans = (ans + dp[t] * ways_place) % MOD;
    }
    cout << ans % MOD << '\n';
    return 0;
}