#include #include static unsigned int W[400]; static unsigned long long T[512][512] __attribute__ ((aligned(4096))); int main() { unsigned int n = 0, k = 0; scanf("%u %u", &n, &k); for (unsigned int i = 0; i < n; i++) scanf("%d", &W[i]); for (unsigned int i = 0; i < n; i++) { memset(T, 0, sizeof(T)); for (unsigned int l = 0, w = W[i]; l < w; l++) T[l][0] = 1; unsigned int c = 0; for (unsigned int a = 0; a < n; a++) { if (a == i) continue; unsigned int w = W[a]; for (unsigned int l = k; l >= w; l--) { unsigned long long *dp = &T[l][1]; const unsigned long long *sp = &T[l-w][0]; for (unsigned int j = 1; j < n; j++) *dp++ += *sp++; } if (++c == 35) { c = 0; for (unsigned int l = 0; l <= k; l++) { unsigned long long *dp = &T[l][1]; for (unsigned int j = 1; j < n; j++) *dp++ %= 167772161; } } } for (int j = 1; j < n; j++) { if (j != 1) printf(" "); printf("%llu", T[k][j] % 167772161); } printf("\n"); } return 0; }