#pragma GCC optimize ("O3") #include using namespace std; typedef long long ll; typedef pair ii; typedef vector vi; typedef double K; constexpr int INF = 0x3f3f3f3f; #define FOR(i, b, e) for(int i = (b); i < (e); i++) #define TRAV(x, a) for(auto &x: (a)) #define SZ(x) ((int)(x).size()) #define PB push_back #define X first #define Y second // template ostream & operator << (ostream&os, const pair & para) { os << para.first << ' ' << para.second; return os; } // template ostream & operator << (ostream&os, const vector & vec){ for(int i = 0; i < sz(vec); i++) os << vec[i] << (i == sz(vec) - 1 ? "" : " "); return os; } constexpr int mod = 167772161; constexpr int N = 410; int dpPref[N][N][N]; int plecak[N][N], nowy[N][N]; int t[N]; void solve() { int n, w; cin >> n >> w; FOR(i, 0, n) cin >> t[i + 1]; dpPref[0][0][0] = 1; FOR(i, 1, n + 1) { FOR(j, 0, n + 1) FOR(k, 0, w + 1) { dpPref[i][j][k] = dpPref[i - 1][j][k]; if(j > 0 && k >= t[i]) { dpPref[i][j][k] = (dpPref[i][j][k] + dpPref[i - 1][j - 1][k - t[i]]) % mod; } } } FOR(j, 0, n + 1) FOR(k, 0, w + 1) plecak[j][k] = dpPref[n][j][k]; FOR(i, 1, n + 1) { memset(nowy, 0, sizeof(nowy)); FOR(j, 0, n + 1) FOR(k, 0, w + 1) { nowy[j][k] = plecak[j][k]; if(j > 0 && k >= t[i]) { nowy[j][k] = (nowy[j][k] + mod - nowy[j - 1][k - t[i]]) % mod; } } FOR(j, 1, n) { int ans = 0; FOR(k, w + 1 - t[i], w + 1) ans = (ans + nowy[j][k]) % mod; cout << ans << " \n"[j + 1 == n]; } } } int main() { ios::sync_with_stdio(0); cin.tie(0); // int tt; cin >> tt; // FOR(te, 0, tt) { // cout << "Case #" << te + 1 << ": "; // solve(); // } solve(); return 0; }