#include // assert #include // cin, cout, ios #include // swap, pair #include // max /** Max Weighted Floor (mwf) の非再帰実装。 mwf(n,m,a,b,c,d) = max_{0 <= x < n} a*x + b*floor((c*x + d)/m) 前提: - n > 0, m > 0, 0 <= c < m, 0 <= d < m 計算量/メモリ: - 時間: O(log m)(ユークリッド互除法的再帰による構造縮約) - 追加メモリ: O(1) */ long mwf(long n, long m, long a, long b, long c, long d) { assert(n > 0 && m > 0 && 0 <= c && c < m && 0 <= d && d < m); long sum_acc = 0, max_acc = b * (d / m); // 現在の累積和, 現在の累積max. 初期値は x = 0 のときの値 while(true) { auto q1 = c / m; c = c % m; a = a + b * q1; auto q2 = d / m; d = d % m; sum_acc = sum_acc + b * q2; max_acc = std::max(max_acc, sum_acc); auto y_max = (c * (n - 1) + d) / m; if(y_max == 0) { return std::max(max_acc, sum_acc + a * (n - 1)); } if(a >= 0) { max_acc = std::max(max_acc, sum_acc + a * (n - 1) + b * y_max); } else { sum_acc = sum_acc + a + b; } n = y_max; d = m - d - 1; std::swap(a, b); std::swap(c, m); } } int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); int t; long n, m, a, b, c, d, ans; std::cin >> t; for(int i = 0; i < t; i++) { std::cin >> n >> m >> a >> b >> c >> d; assert(n > 0 && m > 0 && 0 <= c && c < m && 0 <= d && d < m); ans = mwf(n, m, a, b, c, d); std::cout << ans << '\n'; } }