#include #include #include using namespace std; typedef long long ll; typedef pair pii; #define x first #define y second #define mp make_pair #define mt make_tuple const int MAXN = 400; const int mod = 167772161; int n, k, a[MAXN + 5], dp[MAXN + 5][MAXN + 5], br[MAXN + 5], sol[MAXN + 5][MAXN + 5], povrh[MAXN + 5][MAXN + 5]; int mod_add(int x, int y){ if(x + y >= mod) return x + y - mod; return x + y; } void prep_stuff(){ for(int i = 0 ; i <= MAXN ; ++i){ povrh[i][0] = 1; } for(int i = 1 ; i <= MAXN ; ++i){ for(int j = 1 ; j <= i ; ++j){ povrh[i][j] = mod_add(povrh[i - 1][j - 1], povrh[i - 1][j]); } } } int main(){ prep_stuff(); scanf("%d %d", &n, &k); for(int i = 1 ; i <= n ; ++i){ scanf("%d", &a[i]); br[a[i]]++; } for(int sad = 1 ; sad <= MAXN ; ++sad){ if(!br[sad]) continue; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; int cnt = 0; for(int i = 1 ; i <= n ; ++i){ if(a[i] == sad) continue; ++cnt; for(int j = cnt ; j >= 1 ; --j){ for(int w = k ; w >= 1 ; --w){ if(w >= a[i]){ dp[j][w] = mod_add(dp[j][w], dp[j - 1][w - a[i]]); } } } } for(int j = 0 ; j <= cnt ; ++j){ for(int w = 1 ; w <= k ; ++w){ dp[j][w] = mod_add(dp[j][w], dp[j][w - 1]); } } for(int i = 1 ; i <= n ; ++i){ if(a[i] != sad) continue; for(int j = 1 ; j < n ; ++j){ int pov = 1; for(int l = 0 ; l < br[sad] ; ++l){ if(k - l * sad < 0 || l > j) break; sol[i][j] = mod_add(sol[i][j], ((ll)dp[j - l][k - l * sad] * (ll)povrh[br[sad] - 1][l]) % mod); if(k - (l + 1) * sad >= 0){ ll za_dod = ((ll)dp[j - l][k - (l + 1) * sad] * (ll)povrh[br[sad] - 1][l]) % mod; za_dod = (-za_dod + mod) % mod; sol[i][j] = mod_add(sol[i][j], za_dod); } } } } } for(int i = 1 ; i <= n ; ++i){ for(int j = 1 ; j < n ; ++j){ printf("%d ", sol[i][j]); } printf("\n"); } return 0; }