#include #define mk std::make_pair #define st first #define nd second #define ll long long #define ld long double const int MAX_N = 400; const int MOD = 167772161; int result[MAX_N+3][MAX_N+3]; ll w[MAX_N+3]; int n, k; ll dp[MAX_N+3][MAX_N+3]; struct pair_hash { std::size_t operator()(const std::pair &A) const { return A.st ^ A.nd; } }; void f(int counted, int low, int high) { if (low > high) return; if (low == high){ ll tmp = 0; for (int j = 1; j <= n-1; j++) { tmp = 0; for (int s = k; s > k-w[low]; s--) tmp = (tmp + dp[j][s]) % MOD; result[low][j] = tmp; } return; } int mid = (low + high)/2; std::unordered_map, ll, pair_hash> delta; int cnt = counted; for (int i = low; i <= mid; i++) { for (int j = cnt+1; j >= 1; j--) { for (int s = k; s >= w[i]; s--) { if (dp[j-1][s-w[i]] > 0) { delta[mk(j, s)] = (delta[mk(j, s)] + dp[j-1][s-w[i]]) % MOD; dp[j][s] = (dp[j][s] + dp[j-1][s - w[i]]) % MOD; } } } cnt++; } f(cnt, mid+1, high); cnt = counted; for (auto p : delta) { dp[p.st.st][p.st.nd] = (dp[p.st.st][p.st.nd] - p.nd) % MOD; dp[p.st.st][p.st.nd] = (dp[p.st.st][p.st.nd] + MOD) % MOD; } delta.clear(); for (int i = high; i >= mid+1; i--) { for (int j = cnt+1; j >= 1; j--) { for (int s = k; s >= w[i]; s--) { if (dp[j-1][s-w[i]] > 0) { delta[mk(j, s)] = (delta[mk(j, s)] + dp[j-1][s-w[i]]) % MOD; dp[j][s] = (dp[j][s] + dp[j-1][s - w[i]]) % MOD; } } } cnt++; } f(cnt, low, mid); for (auto p : delta) { dp[p.st.st][p.st.nd] = (dp[p.st.st][p.st.nd] - p.nd) % MOD; dp[p.st.st][p.st.nd] = (dp[p.st.st][p.st.nd] + MOD) % MOD; } } void input() { std::cin >> n >> k; for (int i = 1; i <= n; i++) std::cin >> w[i]; } void solve(){ input(); dp[0][0] = 1; f(0, 1, n); for (int i = 1; i <= n; i++) { for (int j = 1; j < n; j++) std::cout << result[i][j] << " "; std::cout << "\n"; } } int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(nullptr); solve(); return 0; }