#include #define st first #define nd second #define pb push_back using namespace std; typedef long long ll; typedef long double ld; typedef pair pll; const ll MAX = 400 + 2; const ll MOD = 167772161; ll dp[MAX][MAX][MAX]; // [el. processed][num of items][cost] -> nr of subsets void solve(vector &v, ll k) { for (int i = 0; i <= v.size(); ++i) { for (int j = 0; j <= v.size(); ++j) { for (int w = 0; w <= k; ++w) { dp[i][j][w] = 0; } } } dp[0][0][0] = 1; for (int i = 1; i <= v.size(); ++i) { for (int j = 0; j <= k; ++j) { for (int a = 0; a <= i; ++a) { dp[i][a][j] = dp[i-1][a][j]; } if (j >= v[i-1]) { for (int a = 1; a <= i; ++a) { dp[i][a][j] += dp[i-1][a-1][j - v[i-1]]; } } } } for (int a = 0; a <= v.size(); ++a) { //cout << "A: " << a << "=> "; for (int i = 1; i <= k; ++i) { dp[v.size()][a][i] += dp[v.size()][a][i-1]; //cout << dp[v.size()][a][i] << ' '; } } } int main() { ios_base::sync_with_stdio(0); ll n, k; cin >> n >> k; vector v(n); for (int i = 0; i < n; ++i) { cin >> v[i]; } for (int i = 0; i < n; ++i) { ll pom = v[i]; swap(v[i], v.back()); v.pop_back(); solve(v, k); for (int j = 1; j < n; ++j) { ll res = dp[v.size()][j][k] - (k - pom >= 0 ? dp[v.size()][j][k - pom] : 0); cout << res << ' '; } v.pb(pom); swap(v[i], v.back()); cout << endl; } return 0; }