inline T read(){ T sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0'; return sum * fl; }
template <typename T>
inlinevoidwrite(T x){ if (x < 0) { putchar('-'), write<T>(-x); return; } static T sta[35]; int top = 0; do { sta[top++] = x % 10, x /= 10; } while (x); while (top) putchar(sta[--top] + 48); }
intmain(){ cin >> n >> k; FOR(i, 1, n) cin >> a[i]; dp[0] = 1; for (int i = 1; i <= n; i++) for (int j = k; j >= 0;j--) dp[j] += dp[j - a[i]]; cout << dp[k] << endl; return0; }