#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] inline void muladd(int& x, int y) { if((x+=y)>=mod) x-=mod; } 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) { muladd(pre[i][j][l], pre[i - 1][j][l]); if (l - w[i] >= 0 && j - 1 >= 0) { muladd(pre[i][j][l], pre[i - 1][j - 1][l - w[i]]); } } } } } 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) { muladd(suf[i][j][l], suf[i + 1][j][l]); if (l - w[i] >= 0 && j + 1 <= n) { muladd(suf[i][j][l], suf[i + 1][j - 1][l - w[i]]); } } } } } //[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