#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;
}