#include // max, min #include // abort #include // cin, cout, endl #include // swap using ll = long long; // O(A^2)解法 // 入力制約: 0 <= n <= 10^13, 0 < a_i < 2^14, 0 <= b_min, floor(n / a_min) * b_max <= 2^60 int main() { ll n, a1, b1, a2, b2, a3, b3; std::cin >> n >> a1 >> b1 >> a2 >> b2 >> a3 >> b3; ll a_min = std::min({a1, a2, a3}), a_max = std::max({a1, a2, a3}); ll b_min = std::min({b1, b2, b3}), b_max = std::max({b1, b2, b3}); if (!( n >= 0 && n <= 10000000000000 && a_min > 0 && a_max < 16384 && b_min >= 0 && (unsigned __int128)(n / a_min) * (unsigned __int128)b_max <= (1ULL << 60) )) { std::abort(); } if (a2 * b1 < a1 * b2) { std::swap(a1, a2); std::swap(b1, b2); } if (a3 * b1 < a1 * b3) { std::swap(a1, a3); std::swap(b1, b3); } // a1inv = ceil(2^32 / a1) = floor((2^32 - 1) / a1) + 1 // w = max(floor(n / a1) - (a2 + a3), 0) ll r = 0, a1b2 = a1 * std::max(b2, 1LL), a1b3 = a1 * std::max(b3, 1LL), a1inv = ((1LL << 32) - 1) / a1 + 1, w = std::max(n / a1 - (a2 + a3), 0LL); for (ll p = 0, s = n - w * a1; p < a1b2 && s >= 0; p += b2, s -= a2) { for (ll q = 0, t = s; q < a1b3 && t >= 0; q += b3, t -= a3) { // 準定数を除数とする除算の定数倍高速化 // 0 < {a1,a2,a3} < 2^14, 0 <= t < 2^30 // quot = floor((n - (i * a2 + j * a3)) / a1) = floor(t / a1) = floor(t * ceil(2^32 / a1) / 2^32) - (0 または 1) ll quot = t * a1inv >> 32; quot -= (quot * a1 > t); r = std::max(r, quot * b1 + p + q); } } r += w * b1; std::cout << r << std::endl; return 0; }