#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) { auto& current = L[i][c]; for (auto pair : L[i - 1][c]) current.insert(pair); int j = c - w[i - 1]; if (j >= 0) { auto& prev = L[i - 1][j]; for (auto pair : prev) { current[pair.first + 1] += pair.second; current[pair.first + 1] = current[pair.first + 1] % 167772161; } } } } 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; current[pair.first + back] = current[pair.first + back] % 167772161; } cc -= w[i - 1]; ++back; sign *= -1; } } for (int j = 1; j < n - 1; ++j) { if (current[j] % 167772161 < 0) current[j] += 167772161; std::cout << current[j] % 167772161 << " "; } if (current[n - 1] % 167772161 < 0) current[n - 1] += 167772161; std::cout << current[n - 1] % 167772161 << std::endl; } return 0; }