#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, sum;
cin >> n >> sum;
vector<int> arr(n);
for (int i = 0; i < n; ++i)
cin >> arr[i];
// 动态规划
// --- 状态转移方程 dp[i][j] = dp[i - 1][j] + dp[i - 1][j - arr[i]]
// --- i是前i个数,j是sum(j - arr[i]即是指,加上当前数)
vector<vector<long long>> dp(n, vector<long long>(sum + 1, 0));
dp[0][0] = 1; // 什么都不选,和为0的组合有 1 种
if (arr[0] <= sum)
dp[0][arr[0]] = 1; // 选择第一个数,和为 arr[0] 的组合有 1 种
for (int i = 1; i < n; ++i) {
for (long long j = 0; j <= sum; ++j) {
dp[i][j] = dp[i - 1][j];
if (j >= arr[i])
dp[i][j] += dp[i - 1][j - arr[i]];
}
}
cout << dp[n - 1][sum] << endl;
return 0;
}