#include template void __print(Ts &&...ts) {}; //#ifdef DEBUG #include "../template/print.hpp" //#endif // DEBUG using namespace std; typedef long long ll; typedef long double ld; typedef complex cd; typedef pair pi; typedef pair pl; typedef pair pd; template using vec = vector; typedef vector vi; typedef vector vvi; typedef vector vd; typedef vector vvd; typedef vector vl; typedef vector vvl; typedef vector vpi; typedef vector vpl; typedef vector vcd; template using pq_max = priority_queue; template using pq_min = priority_queue, greater>; #define FOR(i, a, b) for (int i = a; i < (b); ++i) #define F0R(i, a) for (int i = 0; i < (a); ++i) #define FORd(i, a, b) for (int i = (b)-1; i >= a; --i) #define F0Rd(i, a) for (int i = (a)-1; i >= 0; --i) #define trav(a, x) for (auto &a : x) #define uid(a, b) uniform_int_distribution(a, b)(rng) #define pln(x) cout << x << "\n" #define ps(x) cout << x << " " #define entr cout << "\n" #define IN(n) \ int n; \ cin >> n; #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define fir first #define sec second #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() #define ins insert #define beg begin template bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; } template bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// const int big = 1e9; const int mod = 167772161; int n, k; ll dp[401][401][401] = {0}; void printftab() { FOR(i, 0, k + 1) { FOR(j, 0, n) { cout << dp[n][i][j] << " "; } cout << "\n"; } } // dp[weight][count] void knapsack(const vi &weights, ll k) { FOR(i, 0, k + 1) { dp[i][0][0] = 1; } FOR(i, 1, weights.size()) { if (weights[i] == big) continue; FOR(j, 0, weights[i]) { FOR(c, 0, weights.size()) { dp[i][j][c] = dp[i - 1][j][c]; } } FOR(j, weights[i], k + 1) { FOR(c, 1, weights.size()) { dp[i][j][c] = (dp[i - 1][j][c] + dp[i - 1][j - weights[i]][c - 1]) % mod; } } } } void knapsack_sub(const vi &weights, int ind) { FOR(c, 1, weights.size()) { FORd(j, weights[ind], k + 1) { // if (dp[n][j][c] >= dp[n][j - weights[ind]][c - 1]) { dp[n][j][c] = (dp[n][j][c] - dp[n][j - weights[ind]][c - 1]) % mod; while(dp[n][j][c] < 0) dp[n][j][c] += mod; // } } } } void knapsack_add(const vi &weights, int ind) { FORd(j, weights[ind], k + 1) { FOR(c, 1, weights.size()) { dp[n][j][c] = (dp[n][j][c] + dp[n][j - weights[ind]][c - 1]) % mod; } } } void solution() { cin >> n >> k; vi weights; weights.push_back(big); FOR(i, 0, n) { int a; cin >> a; weights.push_back(a); } knapsack(weights, k); FOR(i, 1, n + 1) { // if (i == 2) { // printftab(); // } // cout << "=======\n"; knapsack_sub(weights, i); // if (i == 2) { // printftab(); // } FOR(j, 1, n) { ll sum = 0; FOR(weight, k - weights[i] + 1, k + 1) { sum = (sum + dp[n][weight][j]) % mod; } cout << sum << " "; } cout << "\n"; knapsack_add(weights, i); // knapsack_sub(weights, i); // cout << "sub" << i; // cout << "=========\n"; // printftab(); // cout << "=========\n"; // knapsack_add(weights, i); // // cout << "add" << i << "=========\n"; // printftab(); // cout << "=========\n"; } // printftab(); } int main(void) { ios_base::sync_with_stdio(false); cin.tie(NULL); int qs = 1; // cin >> qs; while (qs--) { solution(); } return 0; }