/// Author : Nguyễn Thái Sơn - Ti20 - THPT chuyên Lương Thế Vinh
#include<bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/trie_policy.hpp>
//#include <ext/rope>
//#pragma GCC optimize("Ofast")
//#pragma GCC optimization("unroll-loops, no-stack-protector")
//#pragma GCC target("avx,avx2,fma")
//using namespace std;
//using namespace __gnu_pbds;
//using namespace __gnu_cxx;
#define fi first
#define se second
#define TASK "test"
#define pb push_back
#define EL cout << endl
#define Ti20_ntson int main()
#define in(x) cout << x << endl
#define all(x) (x).begin(),(x).end()
#define getbit(x, i) (((x) >> (i)) & 1)
#define cntbit(x) __builtin_popcount(x)
#define FOR(i,l,r) for (int i = l; i <= r; i++)
#define FORD(i,l,r) for (int i = l; i >= r; i--)
#define Debug(a,n) for (int i = 1; i <= n; i++) cout << a[i] << " "; cout << endl
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> vii;
typedef unsigned long long ull;
typedef vector<vector<int>> vvi;
const int N = 3005;
const int oo = INT_MAX;
const int mod = 1e9 + 7;
const int d4x[4] = {-1, 0, 1, 0} , d4y[4] = {0, 1, 0, -1};
const int d8x[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, d8y[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int n, k, a[N], m = 0;
inline void Read_Input() {
cin >> n >> k;
FOR(i, 1, n) {
cin >> a[i];
a[i] = abs(a[i]);
m += a[i];
}
}
ll ifact[N + 5], fact[N + 5];
inline ll C(int k, int n) {
if (k > n) return 0;
return (fact[n] * ifact[n - k] % mod)* ifact[k] % mod;
}
long long Pow(int x, int y) {
if (y == 0) return 1;
if (y == 1) return x;
ll res = Pow(x, y / 2);
res = res * res % mod;
if (y & 1) return res * x % mod;
return res;
}
long long dp[105][1005];
inline void Solve() {
fact[0] = 1;
FOR(i, 1, N) fact[i] = fact[i - 1] * i % mod;
ifact[N] = Pow(fact[N], mod - 2);
FORD(i, N, 1) ifact[i - 1] = ifact[i] * i % mod;
dp[0][0] = 1;
/// m = x1 + x2 + ... + x3
for (int i = 1; i <= n; i++)
for (int j = 0; j <= k; j++) {
/// trong do vien bi thu i se co t cap T - P
for (int t = 0; t <= j; t++)
dp[i][j] = (dp[i][j] + (dp[i - 1][j - t] * C(a[i] + t, a[i] + 2 * t) % mod) * ifact[a[i] + 2 * t] % mod) % mod;
}
ll Ans = 0;
for (int i = m; i <= k; i += 2) {
Ans = (Ans + (dp[n][(i - m) / 2] * C(i, k) % mod) * fact[i] % mod) % mod;
}
cout << Ans;
}
Ti20_ntson {
// freopen(TASK".INP","r",stdin);
// freopen(TASK".OUT","w",stdout);
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T = 1;
while (T -- ) {
Read_Input();
Solve();
}
}
Ly8vIEF1dGhvciA6IE5ndXnhu4VuIFRow6FpIFPGoW4gLSBUaTIwIC0gVEhQVCBjaHV5w6puIEzGsMahbmcgVGjhur8gVmluaAoKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KLy8jaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+Ci8vI2luY2x1ZGUgPGV4dC9wYl9kcy90cmllX3BvbGljeS5ocHA+Ci8vI2luY2x1ZGUgPGV4dC9yb3BlPgoKLy8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QiKQovLyNwcmFnbWEgR0NDIG9wdGltaXphdGlvbigidW5yb2xsLWxvb3BzLCBuby1zdGFjay1wcm90ZWN0b3IiKQovLyNwcmFnbWEgR0NDIHRhcmdldCgiYXZ4LGF2eDIsZm1hIikKCi8vdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy91c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKLy91c2luZyBuYW1lc3BhY2UgX19nbnVfY3h4OwoKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIFRBU0sgInRlc3QiCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgRUwgY291dCA8PCBlbmRsCiNkZWZpbmUgVGkyMF9udHNvbiBpbnQgbWFpbigpCiNkZWZpbmUgaW4oeCkgY291dCA8PCB4IDw8IGVuZGwKI2RlZmluZSBhbGwoeCkgKHgpLmJlZ2luKCksKHgpLmVuZCgpCiNkZWZpbmUgZ2V0Yml0KHgsIGkpICgoKHgpID4+IChpKSkgJiAxKQojZGVmaW5lIGNudGJpdCh4KSBfX2J1aWx0aW5fcG9wY291bnQoeCkKI2RlZmluZSBGT1IoaSxsLHIpIGZvciAoaW50IGkgPSBsOyBpIDw9IHI7IGkrKykKI2RlZmluZSBGT1JEKGksbCxyKSBmb3IgKGludCBpID0gbDsgaSA+PSByOyBpLS0pCiNkZWZpbmUgRGVidWcoYSxuKSBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNvdXQgPDwgYVtpXSA8PCAiICI7IGNvdXQgPDwgZW5kbAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIHBhaXI8aW50LGludD4gdmlpOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxpbnQ+PiB2dmk7Cgpjb25zdCBpbnQgTiA9IDMwMDU7CmNvbnN0IGludCBvbyA9IElOVF9NQVg7CmNvbnN0IGludCBtb2QgPSAxZTkgKyA3Owpjb25zdCBpbnQgZDR4WzRdID0gey0xLCAwLCAxLCAwfSAsIGQ0eVs0XSA9IHswLCAxLCAwLCAtMX07CmNvbnN0IGludCBkOHhbOF0gPSB7LTEsIC0xLCAwLCAxLCAxLCAxLCAwLCAtMX0sIGQ4eVs4XSA9IHswLCAxLCAxLCAxLCAwLCAtMSwgLTEsIC0xfTsKCmludCBuLCBrLCBhW05dLCBtID0gMDsKCmlubGluZSB2b2lkIFJlYWRfSW5wdXQoKSB7CiAgICBjaW4gPj4gbiA+PiBrOwogICAgRk9SKGksIDEsIG4pIHsKICAgICAgICBjaW4gPj4gYVtpXTsKICAgICAgICBhW2ldID0gYWJzKGFbaV0pOwogICAgICAgIG0gKz0gYVtpXTsKICAgIH0KfQoKbGwgaWZhY3RbTiArIDVdLCBmYWN0W04gKyA1XTsKCmlubGluZSBsbCBDKGludCBrLCBpbnQgbikgewogICAgaWYgKGsgPiBuKSByZXR1cm4gMDsKICAgIHJldHVybiAoZmFjdFtuXSAqIGlmYWN0W24gLSBrXSAlIG1vZCkqIGlmYWN0W2tdICUgbW9kOwp9Cgpsb25nIGxvbmcgUG93KGludCB4LCBpbnQgeSkgewogICAgaWYgKHkgPT0gMCkgcmV0dXJuIDE7CiAgICBpZiAoeSA9PSAxKSByZXR1cm4geDsKICAgIGxsIHJlcyA9IFBvdyh4LCB5IC8gMik7CiAgICByZXMgPSByZXMgKiByZXMgJSBtb2Q7CiAgICBpZiAoeSAmIDEpIHJldHVybiByZXMgKiB4ICUgbW9kOwogICAgcmV0dXJuIHJlczsKfQoKbG9uZyBsb25nIGRwWzEwNV1bMTAwNV07CgppbmxpbmUgdm9pZCBTb2x2ZSgpIHsKICAgIGZhY3RbMF0gPSAxOwogICAgRk9SKGksIDEsIE4pIGZhY3RbaV0gPSBmYWN0W2kgLSAxXSAqIGkgJSBtb2Q7CiAgICBpZmFjdFtOXSA9IFBvdyhmYWN0W05dLCBtb2QgLSAyKTsKICAgIEZPUkQoaSwgTiwgMSkgaWZhY3RbaSAtIDFdID0gaWZhY3RbaV0gKiBpICUgbW9kOwogICAgZHBbMF1bMF0gPSAxOwoKICAgIC8vLyBtID0geDEgKyB4MiArIC4uLiArIHgzCgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IGs7IGorKykgewogICAgICAgICAgICAgICAgLy8vIHRyb25nIGRvIHZpZW4gYmkgdGh1IGkgc2UgY28gdCBjYXAgVCAtIFAKICAgICAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDw9IGo7IHQrKykKICAgICAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IChkcFtpXVtqXSArIChkcFtpIC0gMV1baiAtIHRdICogQyhhW2ldICsgdCwgYVtpXSArIDIgKiB0KSAlIG1vZCkgKiBpZmFjdFthW2ldICsgMiAqIHRdICUgbW9kKSAlIG1vZDsKICAgICAgICB9CiAgICBsbCBBbnMgPSAwOwoKICAgIGZvciAoaW50IGkgPSBtOyBpIDw9IGs7IGkgKz0gMikgewogICAgICAgIEFucyA9IChBbnMgKyAoZHBbbl1bKGkgLSBtKSAvIDJdICogQyhpLCBrKSAlIG1vZCkgKiBmYWN0W2ldICUgbW9kKSAlIG1vZDsKICAgIH0KICAgIGNvdXQgPDwgQW5zOwp9CgpUaTIwX250c29uIHsKLy8gICAgZnJlb3BlbihUQVNLIi5JTlAiLCJyIixzdGRpbik7Ci8vICAgIGZyZW9wZW4oVEFTSyIuT1VUIiwidyIsc3Rkb3V0KTsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGludCBUID0gMTsKICAgIHdoaWxlIChUIC0tICkgewogICAgICAgIFJlYWRfSW5wdXQoKTsKICAgICAgICBTb2x2ZSgpOwogICAgfQp9Cg==