#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; std::vector > delta; std::vector tmp(k+3, 0); while (delta.size() < n+1) delta.push_back(tmp); 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[j][s] = (delta[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); for (int j = 1; j <= cnt; j++) { for (int s = 0; s <= k; s++) { dp[j][s] = (dp[j][s] - delta[j][s]) % MOD; dp[j][s] = (dp[j][s] + MOD) % MOD; delta[j][s] = 0; } } cnt = counted; 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[j][s] = (delta[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 (int j = 1; j <= cnt; j++) { for (int s = 0; s <= k; s++) { dp[j][s] = (dp[j][s] - delta[j][s]) % MOD; dp[j][s] = (dp[j][s] + MOD) % MOD; delta[j][s] = 0; } } } 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; }