#include #include #include #pragma GCC optimize ("O3") std::vector>> subsets; std::vector indx; // Source of this function: https://slaystudy.com/find-all-subsets-of-an-array-c/ void PrintAllSubsets(int n) { int snum = 0; while (snum < pow(2, n)) { std::vector subset; for (int i = 0; i < n; i++) { if ((snum & (1 << i)) != 0) { subset.push_back((short int)(i)); } } subsets[subset.size()].push_back(subset); ++snum; } } int main() { int n, k, sum = 0, num = 0; bool me = false; std::cin >> k >> n; subsets.resize(k+2); std::vector items, subset; items.resize(k+1); indx.resize(k+1); for (int i = 0; i < k; i++) { std::cin >> items[i]; indx[i] = (short int)(i); } PrintAllSubsets(k); for (int i = 0; i < k; i++) { for (int j = 0; j < k - 1; j++) { for (int x = 0; x < (int)(subsets[j+1].size()); x++) { me = false; sum = 0; for (int y = 0; y < (int)(subsets[j+1][x].size()); y++) { if (subsets[j+1][x][y] == (short int)(i)) { me = true; } sum += (int)(items[subsets[j+1][x][y]]); } if (me) { continue; } if ((sum <= n) && (sum + (int)(items[i]) > n)) { num++; num = num % 167772161; } } std::cout << (num%167772161); if (j != k - 2) { std::cout << " "; } num = 0; } if (i != k - 1) { std::cout << std::endl; } } return 0; }