inlineintrd(){ int x = 0, f = 1, c = getchar(); while (((c - '0') | ('9' - c)) < 0) f = c != '-', c = getchar(); while (((c - '0') | ('9' - c)) > 0) x = x * 10 + c - '0', c = getchar(); return f ? x : -x; }
using i64 = longlong; const i64 P = 1e9 + 7; constint N = 1.5e3; constint LIM = 40;
int n, k, a[N + 5]; int s[N + 5]; i64 f[2][N + 5][N + 5];
intmain(){ n = rd(), k = rd(); for (int i = 1; i <= n; i++) a[i] = rd(); for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i]; f[0][0][0] = 1; for (int i = 1; i <= n; i++) { memset(f[i & 1], 0, sizeof(f[i & 1])); for (int j = std::max(0, s[i] - LIM); j <= std::min(s[n], s[i] + LIM); j++) { int cost = std::abs(s[i] - j); for (int p = cost; p <= k; p++) { if (j) (f[i & 1][j][p] += f[(i - 1) & 1][j - 1][p - cost]) %= P; (f[i & 1][j][p] += f[(i - 1) & 1][j][p - cost]) %= P; } } } i64 ans = 0; for (int i = k; i >= 0; i -= 2) (ans += f[n & 1][s[n]][i]) %= P; printf("%lld\n", ans); return0; }