#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define int long long
#define ll long long
#define ull unsigned long long
#define ld long double
#define yes cout << "YES"<<'\n';
#define no cout << "NO"<<'\n';
#define nl "\n"
#define sz(s) (int) (s).size()
#define fr(n) for (int i = 0; i < n; ++i)
#define aw3dni_ink_tet3aleg ios_base::sync_with_stdio(false), cout.tie(NULL), cin.tie(NULL);
// const double PI = 3.14159265358979323846264338327950288419716939937510L;;
#define sp(x) fixed << setprecision(x)
#define all(v) v.begin(), v.end()
#define ff first
#define ss second
#define pii pair<ll,ll>
#define put(x) return void(cout << x)
#define all(v) v.begin(), v.end()
#define allr(v) v.rbegin(), v.rend()
#define cin(vec) \
for (auto &i: vec) \
cin >> i
#define cout(vec) \
for (auto &i: vec) \
cout << i << " "; \
cout << "\n";
#define ON(n, k) ((n) | (1ll << (k)))
#define OFF(n, k) ((n) & ~(1ll << (k)))
#define isON(n, k) (((n) >> (k)) & 1)
#define flip(n, k) ((n) ^ (1ll << (k)))
#define popcnt(x) (__builtin_popcountll(x))
template<typename T = int>
istream &operator>>(istream &in, vector<T> &v) {
for (auto &x: v)in >> x;
return in;
}
template<typename T = int>
ostream &operator<<(ostream &out, const vector<T> &v) {
for (const T &x: v)out << x << ' ';
return out;
}
void FILES() {
aw3dni_ink_tet3aleg
// freopen("angle3.in", "r", stdin);
// freopen("angle3.out", "w", stdout);
}
#define ceil_i(a, b) (((ll) (a) + (ll) (b - 1)) / (ll) (b))
#define floor_i(a, b) (a / b)
#define round_i(a, b) ((a + (b / 2)) / b)
ll OO = 1e17, MOD = 1e9 + 7; //1e9 + 7 ,,998244353
// int add(int a, int b) { return ((a % MOD) + (b % MOD) + MOD) % MOD; }
// int mul(int a, int b) { return (((a % MOD) * (b % MOD))) % MOD; }
int add(int a, int b) {
if (a < 0)
a += MOD;
if (a >= MOD)
a -= MOD;
if (b < 0)
b += MOD;
if (b >= MOD)
b -= MOD;
if (a + b >= MOD)
return a + b - MOD;
return a + b;
}
// int add(int a, int b) {
// return (0ll + a + b + MOD) % MOD;
// }
int sub(int a, int b) {
return add(a, -b);
}
int mul(int a, int b) {
return (1ll * a * b) % MOD;
}
// int sub(int a, int b) { return (((a % MOD) - (b % MOD)) + MOD) % MOD; }
#define INF 1e18
int dx[] = {1, 0, -1, 0, -1, -1, 1, 1};
int dy[] = {0, -1, 0, 1, -1, 1, -1, 1};
char di[] = {'D', 'L', 'U', 'R'};
// up right down left
const int N = 1e3 + 5, X = 505, EPS = 1e-12;
// وَقُلْ رَبِّ زِدْنِي عِلْمًا
// typedef ll T;
// typedef complex<T> pt;
// #define x real()
// #define y imag()
ll fact[N + 1], inv_fact[N + 1];
ll modPow(ll x, ll n, ll mod) {
x %= mod;
ll res = 1;
while (n > 0) {
if (n % 2) res = res * x % mod;
x = x * x % mod;
n /= 2;
}
return res;
}
int modInverse(int a, int m) {
/// m==>MOD
// eq = c*(a^-1)-- c is Numerator --- a is Denominator
//a==>mod inverse
// use mull(c,modInvers)
return modPow(a, m - 2, MOD);
}
void factorial() {
fact[0] = 1;
for (int i = 1; i <= N; i++) fact[i] = fact[i - 1] * i % MOD;
}
void inv_factorial() {
inv_fact[N] = modPow(fact[N], MOD - 2, MOD);
for (int i = N; i >= 1; i--) inv_fact[i - 1] = inv_fact[i] * i % MOD;
}
ll NCR(ll n, ll r) {
if (r < 0 || r > n) return 0;
return fact[n] * inv_fact[r] % MOD * inv_fact[n - r] % MOD;
}
void pre_count() {
factorial();
inv_factorial();
}
int n , k ;
ll arr[N],dp[N][X];
ll calc(int idx , int rem){
if(rem<0)
return 0;
if(idx==n)
return rem==0;
int &ret = dp[idx][rem];
if(~ret)
return ret;
ret = 0;
for(int i = 0;i<=min(k-1,arr[idx]-1);i++){
if(rem>=i)
ret =add(ret,mul(NCR(arr[idx],i),calc(idx+1,rem-i)));
}
return ret;
}
void solve() {
cin >> n >> k ;
for(int i = 0 ; i<n ; i++){
cin >>arr[i];
}
memset(dp,-1,sizeof(dp));
ll ans = calc(0,k);
if(ans > MOD)
ans-=MOD;
cout << ans;
}
signed main() {
//=========================================================================
FILES();
//=========================================================================
int T = 1, t = 1;
// phi_1_to_n();
// linear_sieve(1e6);
pre_count();
// sieve();
// PascalPyramid();
// computeCatalan();
// preprocess(50);
// totient_sieve();
// cin >> T;
while (T--) {
solve();
t++;
// vid++;
cout << nl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgoKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZTxULCBudWxsX3R5cGUsIGxlc3M8VD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSB5ZXMgY291dCA8PCAiWUVTIjw8J1xuJzsKI2RlZmluZSBubyBjb3V0IDw8ICJOTyI8PCdcbic7CiNkZWZpbmUgbmwgIlxuIgojZGVmaW5lIHN6KHMpIChpbnQpIChzKS5zaXplKCkKI2RlZmluZSBmcihuKSBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKI2RlZmluZSBhdzNkbmlfaW5rX3RldDNhbGVnIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjb3V0LnRpZShOVUxMKSwgY2luLnRpZShOVUxMKTsKLy8gY29uc3QgZG91YmxlIFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTcxNjkzOTkzNzUxMEw7OwojZGVmaW5lIHNwKHgpIGZpeGVkIDw8IHNldHByZWNpc2lvbih4KQojZGVmaW5lIGFsbCh2KSB2LmJlZ2luKCksIHYuZW5kKCkKI2RlZmluZSBmZiBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAojZGVmaW5lIHBpaSBwYWlyPGxsLGxsPgojZGVmaW5lIHB1dCh4KSByZXR1cm4gdm9pZChjb3V0IDw8IHgpCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSwgdi5lbmQoKQojZGVmaW5lIGFsbHIodikgdi5yYmVnaW4oKSwgdi5yZW5kKCkKI2RlZmluZSBjaW4odmVjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBmb3IgKGF1dG8gJmk6IHZlYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgY2luID4+IGkKI2RlZmluZSBjb3V0KHZlYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBmb3IgKGF1dG8gJmk6IHZlYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNvdXQgPDwgaSA8PCAiICI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGNvdXQgPDwgIlxuIjsKI2RlZmluZSBPTihuLCBrKSAoKG4pIHwgKDFsbCA8PCAoaykpKQojZGVmaW5lIE9GRihuLCBrKSAoKG4pICYgfigxbGwgPDwgKGspKSkKI2RlZmluZSBpc09OKG4sIGspICgoKG4pID4+IChrKSkgJiAxKQojZGVmaW5lIGZsaXAobiwgaykgKChuKSBeICgxbGwgPDwgKGspKSkKI2RlZmluZSBwb3BjbnQoeCkgKF9fYnVpbHRpbl9wb3Bjb3VudGxsKHgpKQoKdGVtcGxhdGU8dHlwZW5hbWUgVCA9IGludD4KaXN0cmVhbSAmb3BlcmF0b3I+Pihpc3RyZWFtICZpbiwgdmVjdG9yPFQ+ICZ2KSB7CiAgICBmb3IgKGF1dG8gJng6IHYpaW4gPj4geDsKICAgIHJldHVybiBpbjsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVCA9IGludD4Kb3N0cmVhbSAmb3BlcmF0b3I8PChvc3RyZWFtICZvdXQsIGNvbnN0IHZlY3RvcjxUPiAmdikgewogICAgZm9yIChjb25zdCBUICZ4OiB2KW91dCA8PCB4IDw8ICcgJzsKICAgIHJldHVybiBvdXQ7Cn0KCnZvaWQgRklMRVMoKSB7CiAgICBhdzNkbmlfaW5rX3RldDNhbGVnCiAgICAvLyBmcmVvcGVuKCJhbmdsZTMuaW4iLCAiciIsIHN0ZGluKTsKICAgIC8vIGZyZW9wZW4oImFuZ2xlMy5vdXQiLCAidyIsIHN0ZG91dCk7Cn0KCiNkZWZpbmUgY2VpbF9pKGEsIGIpICgoKGxsKSAoYSkgKyAobGwpIChiIC0gMSkpIC8gKGxsKSAoYikpCiNkZWZpbmUgZmxvb3JfaShhLCBiKSAoYSAvIGIpCiNkZWZpbmUgcm91bmRfaShhLCBiKSAoKGEgKyAoYiAvIDIpKSAvIGIpCgpsbCBPTyA9IDFlMTcsIE1PRCA9IDFlOSArIDc7IC8vMWU5ICsgNyAsLDk5ODI0NDM1MwoKLy8gaW50IGFkZChpbnQgYSwgaW50IGIpIHsgcmV0dXJuICgoYSAlIE1PRCkgKyAoYiAlIE1PRCkgKyBNT0QpICUgTU9EOyB9CgovLyBpbnQgbXVsKGludCBhLCBpbnQgYikgeyByZXR1cm4gKCgoYSAlIE1PRCkgKiAoYiAlIE1PRCkpKSAlIE1PRDsgfQppbnQgYWRkKGludCBhLCBpbnQgYikgewogICAgaWYgKGEgPCAwKQogICAgICAgIGEgKz0gTU9EOwogICAgaWYgKGEgPj0gTU9EKQogICAgICAgIGEgLT0gTU9EOwogICAgaWYgKGIgPCAwKQogICAgICAgIGIgKz0gTU9EOwogICAgaWYgKGIgPj0gTU9EKQogICAgICAgIGIgLT0gTU9EOwogICAgaWYgKGEgKyBiID49IE1PRCkKICAgICAgICByZXR1cm4gYSArIGIgLSBNT0Q7CiAgICByZXR1cm4gYSArIGI7Cn0KCi8vIGludCBhZGQoaW50IGEsIGludCBiKSB7Ci8vICAgICByZXR1cm4gKDBsbCArIGEgKyBiICsgTU9EKSAlIE1PRDsKLy8gfQppbnQgc3ViKGludCBhLCBpbnQgYikgewogICAgcmV0dXJuIGFkZChhLCAtYik7Cn0KCmludCBtdWwoaW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gKDFsbCAqIGEgKiBiKSAlIE1PRDsKfQoKLy8gaW50IHN1YihpbnQgYSwgaW50IGIpIHsgcmV0dXJuICgoKGEgJSBNT0QpIC0gKGIgJSBNT0QpKSArIE1PRCkgJSBNT0Q7IH0KCgojZGVmaW5lIElORiAxZTE4CgppbnQgZHhbXSA9IHsxLCAwLCAtMSwgMCwgLTEsIC0xLCAxLCAxfTsKaW50IGR5W10gPSB7MCwgLTEsIDAsIDEsIC0xLCAxLCAtMSwgMX07CmNoYXIgZGlbXSA9IHsnRCcsICdMJywgJ1UnLCAnUid9OwovLyB1cCByaWdodCBkb3duIGxlZnQKCmNvbnN0IGludCBOID0gMWUzICsgNSwgWCA9IDUwNSwgRVBTID0gMWUtMTI7CgovLyDZiNmO2YLZj9mE2ZIg2LHZjtio2ZDZkSDYstmQ2K/ZktmG2ZDZiiDYudmQ2YTZktmF2YvYpwovLyB0eXBlZGVmIGxsIFQ7Ci8vIHR5cGVkZWYgY29tcGxleDxUPiBwdDsKLy8gI2RlZmluZSB4IHJlYWwoKQovLyAjZGVmaW5lIHkgaW1hZygpCmxsIGZhY3RbTiArIDFdLCBpbnZfZmFjdFtOICsgMV07CmxsIG1vZFBvdyhsbCB4LCBsbCBuLCBsbCBtb2QpIHsKICAgIHggJT0gbW9kOwogICAgbGwgcmVzID0gMTsKICAgIHdoaWxlIChuID4gMCkgewogICAgICAgIGlmIChuICUgMikgcmVzID0gcmVzICogeCAlIG1vZDsKICAgICAgICB4ID0geCAqIHggJSBtb2Q7CiAgICAgICAgbiAvPSAyOwogICAgfQogICAgcmV0dXJuIHJlczsKfQogCmludCBtb2RJbnZlcnNlKGludCBhLCBpbnQgbSkgewogICAgLy8vIG09PT5NT0QKICAgIC8vIGVxID0gYyooYV4tMSktLSBjIGlzIE51bWVyYXRvciAtLS0gYSBpcyBEZW5vbWluYXRvcgogICAgLy9hPT0+bW9kIGludmVyc2UKICAgIC8vIHVzZSBtdWxsKGMsbW9kSW52ZXJzKQogICAgcmV0dXJuIG1vZFBvdyhhLCBtIC0gMiwgTU9EKTsKfQogCnZvaWQgZmFjdG9yaWFsKCkgewogICAgZmFjdFswXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyBpKyspIGZhY3RbaV0gPSBmYWN0W2kgLSAxXSAqIGkgJSBNT0Q7Cn0KIAp2b2lkIGludl9mYWN0b3JpYWwoKSB7CiAgICBpbnZfZmFjdFtOXSA9IG1vZFBvdyhmYWN0W05dLCBNT0QgLSAyLCBNT0QpOwogICAgZm9yIChpbnQgaSA9IE47IGkgPj0gMTsgaS0tKSBpbnZfZmFjdFtpIC0gMV0gPSBpbnZfZmFjdFtpXSAqIGkgJSBNT0Q7Cn0KIApsbCBOQ1IobGwgbiwgbGwgcikgewogICAgaWYgKHIgPCAwIHx8IHIgPiBuKSByZXR1cm4gMDsKICAgIHJldHVybiBmYWN0W25dICogaW52X2ZhY3Rbcl0gJSBNT0QgKiBpbnZfZmFjdFtuIC0gcl0gJSBNT0Q7Cn0KIAp2b2lkIHByZV9jb3VudCgpIHsKICAgIGZhY3RvcmlhbCgpOwogICAgaW52X2ZhY3RvcmlhbCgpOwp9CmludCBuICwgayA7CmxsIGFycltOXSxkcFtOXVtYXTsKbGwgY2FsYyhpbnQgaWR4ICwgaW50IHJlbSl7CiAgICBpZihyZW08MCkKICAgICByZXR1cm4gMDsKICAgIGlmKGlkeD09bikKICAgICAgICByZXR1cm4gcmVtPT0wOwogICAgaW50ICZyZXQgPSBkcFtpZHhdW3JlbV07CiAgICBpZih+cmV0KQogICAgIHJldHVybiByZXQ7CiAgICByZXQgPSAwOwogICAgZm9yKGludCBpID0gMDtpPD1taW4oay0xLGFycltpZHhdLTEpO2krKyl7CiAgICAgICAgaWYocmVtPj1pKQogICAgICAgICAgICByZXQgPWFkZChyZXQsbXVsKE5DUihhcnJbaWR4XSxpKSxjYWxjKGlkeCsxLHJlbS1pKSkpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG4gPj4gayA7CiAgICBmb3IoaW50IGkgPSAwIDsgaTxuIDsgaSsrKXsKICAgICAgICBjaW4gPj5hcnJbaV07CiAgICB9CiAgICBtZW1zZXQoZHAsLTEsc2l6ZW9mKGRwKSk7CiAgICBsbCBhbnMgPSBjYWxjKDAsayk7CiAgICBpZihhbnMgPiBNT0QpCiAgICAgICAgYW5zLT1NT0Q7CiAgICBjb3V0IDw8IGFuczsKfQoKCnNpZ25lZCBtYWluKCkgewogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBGSUxFUygpOwogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBpbnQgVCA9IDEsIHQgPSAxOwogICAgLy8gcGhpXzFfdG9fbigpOwogICAgLy8gbGluZWFyX3NpZXZlKDFlNik7CiAgICBwcmVfY291bnQoKTsKICAgIC8vIHNpZXZlKCk7CiAgICAvLyBQYXNjYWxQeXJhbWlkKCk7CiAgICAvLyBjb21wdXRlQ2F0YWxhbigpOwogICAgLy8gcHJlcHJvY2Vzcyg1MCk7CiAgICAvLyB0b3RpZW50X3NpZXZlKCk7CiAgICAvLyBjaW4gPj4gVDsKICAgIHdoaWxlIChULS0pIHsKICAgICAgICBzb2x2ZSgpOwogICAgICAgIHQrKzsKICAgICAgICAvLyB2aWQrKzsKICAgICAgICBjb3V0IDw8IG5sOwogICAgfQogICAgcmV0dXJuIDA7Cn0K