#include #include void combinationUtil(int arr[], int data[], int start, int end, int index, int r, int cmb, int k, int *cnt) { if (index == r) { long long int counter = 0; for (int j = 0; j < r; j++) { counter = counter + data[j]; } if ((counter + arr[cmb] > k) && (counter <= k)) { (*cnt) = ((*cnt) + 1) % 167772161; } return; } for (int i = start; i <= end && end - i + 1 >= r - index; i++) { if (cmb != i) { data[index] = arr[i]; combinationUtil(arr, data, i + 1, end, index + 1, r, cmb, k, cnt); } } } void combinations(int* omega, int n, int comb, int num, int k, int*counter) { int *data = (int *)calloc(num + 1, sizeof(int)); combinationUtil(omega, data, 0, n - 1, 0, num, comb, k, counter); } int main() { int HELP = 10; int n, k; int* omega; scanf("%d %d\n", &n, &k); omega = (int*)calloc(n, sizeof(int)); for (int i = 0; i < n; i++) scanf("%d", &(omega[i])); for (int comb = 0; comb < n; comb++) { for (int num = 1; num < n; num++) { int counter = 0; combinations(omega, n, comb, num, k, &counter); if (counter == 0) { for (int fin = num; fin < n; fin++) printf("%d ", 0); break; } else printf("%d ", counter); } printf("\n"); } return 0; }