#include #include #include #include #pragma GCC optimize("O3") #pragma GCC target("sse4") #pragma GCC target("avx2") #define deb(x) cout << #x << " = " << x << "\n" #define all(x) (x).begin(), (x).end() #define len(x) (int) x.size() #define lsb(x) (x) & -(x) #define l(x) (x << 1) + 1 #define r(x) (x << 1) + 2 #define v(x) (int)(x - 'a') #define xx first #define yy second #define mp make_pair #define pb push_back #define lb lower_bound #define ub upper_bound using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef pair pii; typedef pair pld; typedef pair pll; template > using pb_heap = __gnu_pbds::priority_queue ; template > using pb_map = tree ; template > using pb_umap = gp_hash_table ; template > using umap = unordered_map ; template using uset = unordered_set ; template using vec = vector ; const ll infll = numeric_limits ::max() >> 1; const int inf = numeric_limits ::max() >> 1; const int mod = 5 * (1 << 25) + 1; const int MOD = 5 * (1 << 25) + 1; const int G = 3; const int MAX = 1 << 25; const int N = 404; const int M = 802; int n, k, w[N]; ll ans[N][N]; int pre[N][N][N]; int suf[N][N][N]; int fpow(int b, int p = mod - 2) { int res = 1; int pow = b; for (; p; p >>= 1) { if (p & 1) { res = 1ll * res * pow % mod; } pow = 1ll * pow * pow % mod; } return res; } void input() { cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> w[i]; } } // [idx][db][súly] void calc_pre() { pre[0][0][0] = 1; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= n; ++j) { for (int l = 0; l <= k; ++l) { pre[i][j][l] += pre[i - 1][j][l]; if (l - w[i] >= 0 && j - 1 >= 0) { pre[i][j][l] += pre[i - 1][j - 1][l - w[i]]; } pre[i][j][l] %= mod; } } } } void calc_suf() { suf[n + 1][0][0] = 1; for (int i = n; i >= 1; --i) { for (int j = 0; j <= n; ++j) { for (int l = 0; l <= k; ++l) { suf[i][j][l] += suf[i + 1][j][l]; if (l - w[i] >= 0 && j + 1 <= n) { suf[i][j][l] += suf[i + 1][j - 1][l - w[i]]; } suf[i][j][l] %= mod; } } } } int mul(int x, int y) { return 1ll*x * y % MOD; } int modpow(int base, int exp) { base %= MOD; int result = 1; while (exp > 0) { if (exp & 1) result = (1ll*result * base) % MOD; base = (1ll*base * base) % MOD; exp >>= 1; } return result; } int modinv(int a) { return modpow(a,MOD-2); } void fft(vector& a, int FFT, int N) { static int rev[MAX]; for (int i = 0; i < N; i++) { rev[i] = (rev[i>>1]>>1)|((i&1)?(N>>1):0); if (i < rev[i]) swap(a[i], a[rev[i]]); } for (int m = 2, m2 = 1; m <= N; m <<= 1, m2 <<= 1) { int wm = modpow(G, (MOD-1)/m*FFT+(FFT==-1?MOD-1:0)); for (int k = 0; k < N; k += m) for (int j = 0, u, t, w = 1; j < m2; j++) t = 1ll*w*a[k+j+m2]%MOD, u = a[k+j], w = 1ll*w*wm%MOD, a[k+j] = (u+t)%MOD, a[k+j+m2] = (u-t+MOD)%MOD; } if (FFT == -1) for (int i = 0, invN = modinv(N); i < N; i++) a[i] = 1ll * a[i] * invN % MOD; } vector multiply(vector a, vector b) { int need = a.size() + b.size() - 1, nbase = 0; while (1 << nbase < need) { ++nbase; } int sz = 1 << nbase; a.resize(sz); b.resize(sz); bool equal = (a == b); fft(a, 1, sz); if (equal) { b = a; } else { fft(b, 1, sz); } for (int i = 0; i < sz; ++i) { a[i] = mul(a[i], b[i]); } fft(a, -1, sz); a.resize(need); return a; } //[idx][db][súly] void solve() { calc_pre(); calc_suf(); for (int cur = 1; cur <= n; ++cur) { for(int db2=0;db2<=n-cur;++db2) { for(int suly2=0;suly2<=k;++suly2) { suf[cur+1][db2][suly2]=(suf[cur+1][db2][suly2]+(suly2?suf[cur+1][db2][suly2-1]:0))%mod; } } for(int db1=0;db1