#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define R22(r) sim>typename enable_if<1 r sizeof(dud(0)),muu&>::type operator<<(c g) { #define R23(r) sim, size_t N>typename enable_if::value,muu&>::type operator<<(zub sim> struct rge {c b, e;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c*r)->decltype(cerr << *r); sim> char dud(...); sim, size_t N> struct zub {c x;}; struct muu { #ifdef LOCAL #define qel(t) sim, class d, class...e mor t r){ris << *(d*)&r;} qel(queue) qel(priority_queue) qel(stack) stringstream a; ~muu() {cerr << a.str() << endl;} R22(<) a << boolalpha << g; ris;} R22(==) ris << range(begin(g), end(g));} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } sim, class m mor pair r){ris << "(" << r.first << ", " << r.second << ")";} sim, class...m mor tupler){ris << zub,0>{r};} R23(!=) g) {ris << (N ? ", " : "(") << get(g.x) << zub{g.x};} R23(==) ) {ris << ")";} #else sim mor const c&){ris;} #endif }; #define imie(r...) "[" #r ": " << (r) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " #define range(a, b) "[[" #a ", " #b "): " << range(a, b) << "] " #define debug muu() << __FUNCTION__ << "#" << __LINE__ << ": " #define arr2(a, i, j) "[" #a imie(i) imie(j) ": " << a[i][j] << "] " #define imask(r...) "[" #r ": " << bitset<8 * sizeof(r)>(r) << "] " using pii = pair ; using ll = long long; using ull = unsigned long long; using ld = long double; using Pii = pii; using vpii = vector; using unt = unsigned int; using vi = vector ; using pll = pair ; using vpll = vector ; sim> void mini(c &a, c b) {if (a > b) a = b;} sim> void maxi(c &a, c b) {if (a < b) a = b;} #include #include using namespace __gnu_pbds; sim, class cmp = less > using ordered_set = tree; const int maxn = 410; ll dp[maxn][maxn]; ll dp_kopia[maxn][maxn]; int w[maxn]; int n, k; const ll mod = 167772161; void dodaj(int waga) { for(int i = n; i > 0; --i) for(int j = waga; j <= k; ++j) { dp[i][j] = (dp[i][j] + dp[i-1][j-waga]) % mod; } } void odejmij(int waga) { for(int i = 1; i <= n; ++i) for(int j = waga; j <= k; ++j) { dp[i][j] = (dp[i][j] - dp[i-1][j-waga]) % mod; } } void restore() { for(int i = 0; i <= n; ++i) { for(int j = 0; j <= k; ++j) dp[i][j] = dp_kopia[i][j]; } } int main() { scanf("%d%d", &n, &k); dp[0][0] = 1; for(int i = 0; i < n; ++i) { scanf("%d", &w[i]); dodaj(w[i]); debug << imie(w[i]); } for(int i = 0; i <= n; ++i) { for(int j = 0; j <= k; ++j) { //~ debug << imie(i) << imie(j) << imie(dp[i][j]); dp_kopia[i][j] = dp[i][j]; } } for(int i = 0; i < n; ++i) { restore(); odejmij(w[i]); for(int j = 1; j <= n-1; ++j) { ll suma = 0; for(int waga = 0; waga <= k; ++waga) if(waga + w[i] > k) suma += dp[j][waga]; suma %= mod; if(suma < 0) suma += mod; printf("%lld", suma); if(j == n-1) puts(""); else printf(" "); } } }