#include #include static int W[400]; static int M[404][404][404]; static int recurse(int a, int i, int j, int k, int m, int n) { if (j == 0) return k < m ? 1 : 0; if (a >= n) return 0; if (M[j][k][a] != -1) return M[j][k][a]; int p = recurse(a + 1, i, j, k, m, n); if (a != i && W[a] <= k) { p += recurse(a + 1, i, j - 1, k - W[a], m, n); p %= 167772161; } M[j][k][a] = p; return p; } int main() { int n = 0, k = 0; scanf("%d %d", &n, &k); for (int i = 0; i < n; i++) scanf("%d", &W[i]); for (int i = 0; i < n; i++) { memset(M, -1, sizeof(M)); for (int j = 1; j < n; j++) { if (j != 1) printf(" "); printf("%d", recurse(0, i, j, k, W[i], n)); } printf("\n"); } return 0; }