#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 <= 10^5, 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 <= 100000 && 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^62 / a1) = floor((2^62 - 1) / a1) + 1 // 2^62 / a1 <= ceil(2^62 / a1) = a1inv < ((2^62 / a1) + 1) ll r = 0, a1b2 = a1 * std::max(b2, 1LL), a1b3 = a1 * std::max(b3, 1LL), a1inv = ((1LL << 62) - 1) / a1 + 1; for (ll p = 0, s = n; p < a1b2 && s >= 0; p += b2, s -= a2) { for (ll q = 0, t = s; q < a1b3 && t >= 0; q += b3, t -= a3) { // 準定数を除数とする除算の定数倍高速化 // 0 < a1 <= 10^5, 0 <= t <= n <= 10^13 < 2^62 // quot = floor((n - (i * a2 + j * a3)) / a1) = floor(t / a1) = floor((t * 4) * ceil(2^62 / a1) / 2^64) - (0 または 1) ll quot = (ll)(((unsigned __int128)(t * 4) * (unsigned __int128)a1inv) >> 64); quot -= (quot * a1 > t); r = std::max(r, quot * b1 + p + q); } } std::cout << r << std::endl; return 0; }