#include // #include "../Kody/simple-console-debug/debug.h" #define ll long long #define str string #define pii pair #define pll pair #define fi first #define se second #define vc vector #define vvc vector #define vi vector #define vvi vector #define vvvi vector #define vvvvi vector #define vll vector #define vvll vector #define vvvll vector #define vvvvll vector #define vs vector #define vvs vector #define vpii vector #define vvpii vector #define vpll vector #define vvpll vector #define vb vector #define vvb vector #define rep(i, a, b) for (int i = (a); i < int(b); i++) #define repi(i, a, b) for (int i = (a); i <= int(b); i++) using namespace std; ll INF = LONG_LONG_MAX / 2; int inf = INT_MAX / 2; int mod = 167772161; template void read(vector & _data, L _size, L _shift) { _data.resize(_size + _shift); for (ll i = _shift; i < _size + _shift; i++) cin >> _data[i]; } template void read(vector> & _data, L _rows, L _cols, L _shiftRows, L _shiftCols) { _data.resize(_rows + _shiftRows); for (ll i = 0; i < _rows + _shiftRows; i++) _data[i].resize(_cols + _shiftCols); for (ll i = _shiftRows; i < _rows + _shiftRows; i++) for (ll j = _shiftCols; j < _cols + _shiftCols; j++) cin >> _data[i][j]; } template void write(vector & _data, ll _shift) { for (ll i = _shift; i < _data.size(); i++) cout << _data[i] << " "; cout << endl; } #define vcd vector> vcd fft(vcd W, double mul) { ll n = W.size(); if (n == 1) return W; vcd P(n / 2), Q(n / 2); for (int i = 0; i < n; i ++) { if (i&1) Q[i/2] = W[i]; else P[i/2] = W[i]; } vcd tp = fft(P, mul); vcd tq = fft(Q, mul); vcd tw(n); auto wn = polar(1.0, mul * 2.0 * M_PI / (double) n); auto w = polar(1.0, 0.0); for (int i = 0; i < n; i++) { tw[i] = tp[i % (n / 2)] + w * tq[i % (n / 2)]; w *= wn; } return tw; } //TODO: SOLUTION int N, K; vi w; vvvi p, l; int N2; void initialize_equal(vvvi & x) { x = vvvi(N + 2, vvi(N + 2, vi(K + 2, 0))); repi(i, 0, N + 1) { repi(k, 0, K + 1) { x[i][0][k] = 0; // empty set } x[i][0][0] = 1; } } void initialize_greater_equal(vvvi & x) { x = vvvi(N + 2, vvi(N + 2, vi(K + 2, 0))); repi(i, 0, N + 1) { repi(k, 0, K + 1) { x[i][0][k] = 1; // empty set } } } ll power(ll a, int e, ll p){ if(e==0) return 1; ll x = power(a, e/2, p); x = x*x%p; return e%2 ? x*a%p : x; } ll inv(ll x, ll p){ return power(x, p-2, p); } void align(vll &A, vll &B){ int siz=1; while(siz<(int)A.size()+(int)B.size()) siz *= 2; A.resize(siz, 0); B.resize(siz, 0); } vll fft(const vll&Coef, ll sqrt1, ll p){ // deb::Indent i; // cerr << i.head << "fft(" << deb::Container(Coef) << ", " << sqrt1 << ", " << p << ")" << endl; int n = Coef.size(); if(n==1) return Coef; vll P(n/2), Q(n/2); for(int i=0;isiz){ deg/=2; gg = gg*gg%pp; } // assert(deg==siz); return gg; } vll poly_mult( vll& v1, vll& v2){ align(v1,v2); // cerr << deb::Container(v1) << endl; // cerr << deb::Container(v2) << endl; ll gg = get_g(v1.size()); // cerr << "gg=" << gg << endl; vll ft1 = fft(v1, gg, pp); vll ft2 = fft(v2, gg, pp); // cerr << deb::Container(ft1) << endl; // cerr << deb::Container(ft2) << endl; vll ft3 = mult(ft1, ft2, pp); // cerr << deb::Container(ft3) << endl; vll v3 = ifft(ft3, gg, pp); // cerr << deb::Container(v3) << endl; return v3; } void do_magic(vector>&Results){ for(int i=1;i<=N;i++){ vectorJsums(N+1); for(int k=0;k<=K;k++){ // cerr << "i=" << i << " k=" << k << endl; vectorW1,W2; for(int m=0;m<=N;m++){ W1.push_back(p[i-1][m][k]); W2.push_back(l[i+1][m][K-k]); } auto prod = poly_mult(W1, W2); // cerr << "W1=" << deb::Container(W1) << endl; // cerr << "W1=" << deb::Container(W2) << endl; // cerr << "W1=" << deb::Container(prod) << endl; for(int j=1;j>&Results){ for(int i=1;i<=N;i++){ int KK = K-w[i]; vectorJsums(N+1); for(int k=0;k<=KK;k++){ // cerr << "i=" << i << " k=" << k << " KK=" << KK << endl; vectorW1,W2; for(int m=0;m<=N;m++){ W1.push_back(p[i-1][m][k]); W2.push_back(l[i+1][m][KK-k]); } auto prod = poly_mult(W1, W2); // cerr << "W1=" << deb::Container(W1) << endl; // cerr << "W1=" << deb::Container(W2) << endl; // cerr << "W1=" << deb::Container(prod) << endl; for(int j=1;j> N >> K; read(w, N, 1); w.push_back(0); initialize_equal(p); initialize_greater_equal(l); repi(i, 1, N) { repi(j, 1, N) { repi(k, 0, K) { p[i][j][k] = p[i - 1][j][k]; if (w[i] <= k) { p[i][j][k] = (p[i][j][k] + p[i - 1][j - 1][k - w[i]]) % mod; } } } } for (int i = N; i > 0; i--) { repi(j, 1, N) { repi(k, 0, K) { l[i][j][k] = l[i + 1][j][k]; if (w[i] <= k) { l[i][j][k] = (l[i][j][k] + l[i + 1][j - 1][k - w[i]]) % mod; } } } } vector>Results(N+1, vector(N+1)); do_magic(Results); do_magic2(Results); for(int i=1;i<=N;i++){ for(int j=1;j> t; while (t--) solve(); } else { solve(); } return 0; }