#include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef double lf; typedef long double Lf; typedef pair pii; typedef pair pll; #define TRACE(x) cerr << #x << " " << x << endl #define FOR(i, a, b) for (int i = (a); i < int(b); i++) #define REP(i, n) FOR(i, 0, n) #define all(x) (x).begin(), (x).end() #define _ << " " << #define fi first #define sec second #define mp make_pair #define pb push_back const int MAXN = 405; int sol[MAXN][MAXN]; int nazad[MAXN][MAXN][MAXN]; int w[MAXN]; int dp[MAXN][MAXN]; int ndp[MAXN][MAXN]; int pref[MAXN][MAXN]; const int mod = 167772161; int add(int x, int y) { x += y; if (x >= mod) return x - mod; return x; } int mul(int x, int y) { return (ll)x * y % mod; } int sub(int x, int y) { x -= y; if (x < 0) return x + mod; return x; } int main() { int n, k; cin >> n >> k; REP(i, n) cin >> w[i]; nazad[n][0][0] = 1; for (int i = n - 1; i >= 0; --i) { REP(weight, MAXN) REP(cnt, MAXN) { nazad[i][weight][cnt] = nazad[i + 1][weight][cnt]; if (weight >= w[i] && cnt) nazad[i][weight][cnt] = add(nazad[i][weight][cnt], nazad[i + 1][weight - w[i]][cnt - 1]); } } dp[0][0] = 1; REP(i, n) { REP(j, n) { pref[j][0] = dp[0][j]; FOR(jj, 1, MAXN) pref[j][jj] = add(pref[j][jj - 1], dp[jj][j]); } vector sol(n, 0); REP(jj, n) REP(rt, k + 1) { if (nazad[i + 1][rt][jj] == 0) continue; FOR(j, jj, n) { sol[j] = add( sol[j], mul(nazad[i + 1][rt][jj], sub(pref[j - jj][k - rt], (k - rt - w[i] >= 0 ? pref[j - jj][k - rt - w[i]] : 0)))); } } FOR(j, 1, n) cout << sol[j] << " "; cout << endl; REP(weight, MAXN) REP(cnt, MAXN) { ndp[weight][cnt] = dp[weight][cnt]; if (weight >= w[i] && cnt) ndp[weight][cnt] = add(ndp[weight][cnt], dp[weight - w[i]][cnt - 1]); } memcpy(dp, ndp, sizeof dp); } return 0; }