#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) { if ((*data + arr[cmb] > k) && (*data <= k)) { (*cnt) = ((*cnt) + 1) % 167772161; } (*data) = 0; return; } for (int i = start; i <= end && end - i + 1 >= r - index; i++) { if (cmb != i) { (*data) += arr[i]; if ((*data) > k) return; 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 = 0; combinationUtil(omega, data, 0, n - 1, 0, num, comb, k, counter); } int main() { 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); printf("%d ", counter); } printf("\n"); } return 0; }