#include #include #include #include #include #define setIO(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout) #define closefile fclose(stdin), fclose(stdout) #define m_p make_pair #define sz(x) (int)x.size() #define see(x) cerr << x << " " #define seeln(x) cerr << x << endl #define out(x) cerr << #x << " = " << x << " " #define outln(x) cerr << #x << " = " << x << endl #define outarr(x, l, r) {cerr << #x"[" << l << " ~ " << r << "] = "; for (int _i = l; _i <= r; ++_i) cerr << x[_i] << " "; cerr << endl;} using namespace std; typedef long long ll; typedef pair pii; template bool checkmax(T &a, T b){return a < b ? a = b, 1 : 0;} template bool checkmin(T &a, T b){return b < a ? a = b, 1 : 0;} const int N = 100005; const ll inf = 0x3f3f3f3f3f3f3f3f; int n; ll m; ll a[N]; struct node { ll a, b; node(ll a = 0, ll b = 0):a(a), b(b){} }c[N], p[77]; node operator + (node a, node b) { //out(a.a); outln(b.a); node c = node(a.a + b.a, max(a.b + b.a, b.b)); if (c.a > inf) c.a = inf; if (c.b > inf) c.b = inf; if (c.a < -inf) c.a = -inf; if (c.b < -inf) c.b = -inf; return c; } bool check(ll rnd) { ll x = rnd - 1; node t(0, 0); for (int i = 60; i >= 0; --i) if (x >> i & 1) t = t + p[i]; if (max(t.a, t.b) >= m) return 1; for (int i = 1; i <= n; ++i) { t = t + c[i]; if (max(t.a, t.b) >= m) return 1; } return 0; } void init() { scanf("%d%lld", &n, &m); for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]); for (int i = 1; i <= n; ++i) c[i] = node(a[i], 0); } void solve() { node t(0, 0); for (int i = 1; i <= n; ++i) t = t + c[i]; if (max(t.a, t.b) <= 0) { printf("-1\n"); return; } p[0] = t; for (int i = 1; i <= 60; ++i) p[i] = p[i - 1] + p[i - 1]; ll l = 1, r = 2000000000000000000, mid, best = -1; while (l <= r) { mid = (l + r) >> 1; if (check(mid)) best = mid, r = mid - 1; else l = mid + 1; } printf("%lld\n", best); } int main() { int t; scanf("%d", &t); while (t--) { init(); solve(); } return 0; }