#include using namespace std; using ll = long long; using ull = unsigned long long; #include using namespace std; constexpr int MAXLEN = 1 << 18; template int solve(int N, int S, vector &a) { if (len <= S) return solve(N, S, a); bitset dp; dp[0] = 1; int i = 0; for(i = 0; i < N && 2 * a[i] <= S;) { int p = i; while(i < N && a[i] == a[p]) i++; int cnt = i - p; for(int take = 1; cnt > 0; take *= 2) { int D = min(take, cnt); long long shift = (ll)(a[p]) * D; cnt -= D; if(shift <= S) dp |= dp << shift; } } int j = S; if(dp[S]) return S; int ans = 0; while(i < N){ while(a[i] + j > S) j--; while(j >= 0 && !dp[j]) j--; if(j < 0) return ans; ans = max(ans, j + a[i]); } return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; while(T--) { int N, S, g = 0; cin >> N >> S; vector a(N); ll tot = 0; for(auto &&v : a) cin >> v, tot += v; if(tot <= S){ cout << tot << '\n'; continue; } sort(a.begin(), a.end()); while(!a.empty() && a.back() > S) a.pop_back(); N = a.size(); if(N <= 12){ int ans = 0; for(int i = 1; i < (1 << N); i++){ int sv = 0; for(int j = 0; j < N; j++){ if(i >> j & 1) sv += a[j]; } if(sv <= S) ans = max(ans, sv); } cout << ans << '\n'; continue; } for(auto &&v : a) g = gcd(g, v); if(g >= 2){ S /= g; for(auto &&v : a) v /= g; } cout << g * solve<16>(N, S, a) << '\n'; } }