#include #include int main(int argc, const char * argv[]) { int n, k; std::cin >> n >> k; int w[n]; for (int i = 0; i < n; ++i) { std::cin >> w[i]; } std::unordered_map L[n + 1][k + 1]; L[0][0].insert({ 0, 1 }); for (int i = 1; i <= n; ++i) { for (int c = 0; c <= k; ++c) { std::unordered_map& current = L[i][c]; for (auto pair : L[i - 1][c]) current.insert(pair); int j = c - w[i - 1]; if (j >= 0) { std::unordered_map& prev = L[i - 1][j]; for (auto pair : prev) { current[pair.first + 1] += pair.second; } } } } for (int i = 1; i <= n; ++i) { std::unordered_map current; for (int c = k - w[i - 1] + 1; c <= k; ++c) { for (auto& pair : L[n][c]) { current[pair.first] += pair.second; } int cc = c, back = 1, sign = -1; while (cc - w[i - 1] >= 0) { for (auto& pair : L[n][cc - w[i - 1]]) { current[pair.first + back] += sign * pair.second; } cc -= w[i - 1]; ++back; sign *= -1; } } for (int j = 1; j < n - 1; ++j) { std::cout << current[j] % 167772161 << " "; } std::cout << current[n - 1] << std::endl; } return 0; }