#include #include #include #include #include using num = int32_t; const num modulo = 167772161; num N, K; num weights[401]; num sorted[401]; num excl_sum_count[401][401]{}; // excluded item, n-tuple num copy[401]; num comb_indices[401]; num comb_n; void comb_reset() { for (int i = 0; i < comb_n; ++i) comb_indices[i] = i; } bool comb_advance() { num from_end = 0; while (comb_indices[comb_n - 1 - from_end] == N-2-from_end) ++from_end; if (from_end > comb_n-1) return false; ++comb_indices[comb_n - 1 - from_end]; num curr = comb_indices[comb_n - 1 - from_end]; while(--from_end >= 0) comb_indices[comb_n - 1 - from_end] = ++curr; return true; } void comb_print() { for (num i = 0; i < comb_n; ++i) std::cout << comb_indices[i] << ' '; std::cout << std::endl; } void make_copy(num excluded_val) { int shift = 0; for (num i = 0; i < N - 1; ++i) { if (shift == 0 && sorted[i] == excluded_val) { shift = 1; } copy[i] = sorted[i + shift]; } } void fill(num excluded_val, num store_idx) { make_copy(excluded_val); for (num i = 1; i <= K; ++i) excl_sum_count[store_idx][i] = 0; for (num cn = 1; cn <= N-1; ++cn) { num ssum = 0; for (int i = 0; i < cn; ++i) ssum += copy[N-2-i]; if (ssum < K - excluded_val) break; comb_n = cn; comb_reset(); do { num sum = 0; for (int i = 0; i < comb_n; ++i) { num index = comb_indices[i]; sum += copy[index]; } if (excluded_val + sum > K && sum <= K) { // std::cout << cn << " " << excluded_val << " " << sum << '\n'; ++excl_sum_count[store_idx][cn]; } } while(comb_advance()); } }; int main() { std::ios::sync_with_stdio(false); FILE *f = fopen("samples-problems/2.in", "r"); // FILE * f = stdin; fscanf(f, "%d %d", &N, &K); for (num i = 0; i < N; ++i) fscanf(f, "%d", &weights[i]); for (num i = 0; i < N; ++i) sorted[i] = weights[i]; std::sort(sorted, sorted+N, [](num a, num b){return a < b;}); for (num i = 0; i < N; ++i) { num val = weights[i]; fill(val, i); } for (num i = 0; i < N; ++i) { for (num j = 1; j < N; ++j) { std::cout << excl_sum_count[i][j]; if (j < N - 1) std::cout << ' '; } if (i < N - 1) std::cout << '\n'; } }