#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } #define COLOR(s) ("\x1b[" s "m") //////////////////////////////////////////////////////////////////////////////// // y^f(0) x y^(f(1)-f(0)) x y^(f(2)-f(1)) x ... x y^(f(n)-f(n-1)) // where f(i) = floor((a i + b) / m) // S: (unsigned or signed) integer // (a n + b) and (m + a) does not overflow // T: monoid with pow // e: identity template T pathUnder(S m, S a, S b, S n, T e, T x, T y) { assert(m >= 1); assert(a >= 0); assert(b >= 0); assert(n >= 0); S c = (a * n + b) / m; T pre = e, suf = e; for (; ; ) { const S p = a / m; a %= m; x = x * y.pow(p); const S q = b / m; b %= m; pre = pre * y.pow(q); c -= (p * n + q); if (c == 0) return pre * x.pow(n) * suf; const S d = (m * c - b - 1) / a + 1; suf = y * x.pow(n - d) * suf; b = m - b - 1 + a; swap(m, a); n = c - 1; c = d; swap(x, y); } } //////////////////////////////////////////////////////////////////////////////// constexpr Int INF = 1001001001001001001LL; struct Data { Int sum, mx; Data() : sum(0), mx(-INF) {} Data(Int sum_, Int mx_) : sum(sum_), mx(mx_) {} friend Data operator*(const Data &a, const Data &b) { return Data(a.sum + b.sum, max(a.mx, a.sum + b.mx)); } Data pow(Int e) const { assert(e >= 0); return (e == 0) ? Data() : Data(e * sum, (sum > 0) ? ((e - 1) * sum + mx) : mx); } }; int main() { for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) { Int N, M, A, B, C, D; scanf("%lld%lld%lld%lld%lld%lld", &N, &M, &A, &B, &C, &D); const auto res = pathUnder(M, C, D, N, Data(), Data(A, 0), Data(B, -INF)); printf("%lld\n", res.mx); } #ifndef LOCAL break; #endif } return 0; }