#include using namespace std; int N, K, m = 167772161; int w[400]; int dp[401][401][401]; int calc(int pos, int i, int k) { if (pos == -1) { return (k == 0 and i == 0) ? 1 : 0; } if (dp[pos][i][k] != -1) { return dp[pos][i][k]; } if (k == 0 and i == 0) { return dp[pos][i][k] = 1; } if (i == 0 or k == 0) { return dp[pos][i][k] = 0; } if (k - w[pos] >= 0) { dp[pos][i][k] = (calc(pos - 1, i - 1, k - w[pos]) + calc(pos - 1, i, k)) % m; } else { dp[pos][i][k] = calc(pos - 1, i, k); } return dp[pos][i][k]; } int legit(int i, int j, int k) { int res = 0; int jter = j; int kr = k; int flip = 1; while (jter >= 0 and kr >= 0) { res += flip * calc(N - 1, jter, kr); res %= m; if (res < 0) res += m; flip = -flip; jter -= 1; kr -= w[i]; } return res; } int main() { //cout << -5 % 2 << endl; cin >> N >> K; for (int i = 0; i < N; i++) { cin >> w[i]; } for (int i = 0; i <= N; i++) for (int j = 0; j <= N; j++) for (int l = 0; l <= K; l++) dp[i][j][l] = -1; /*for (const auto& i : w) { cout << i << " "; }*/ for (int i = 0; i < N; i++) { for (int j = 1; j < N; j++) { int sum = 0; for (int k = K; k > K - w[i]; k--) { //cout << "\tcalc(" << N - 1 << ", " << j << ", " << k << ") = " << calc(N - 1, j, k) << endl; //sum += calc(N - 1, j, k); sum += legit(i, j, k); sum %= m; } cout << sum << " "; } cout << endl; } }