#define MULTI //------>8-------- begin kyopro_library/template.hpp --------->8------ //------>8------ begin kyopro_library/base/include.hpp ------->8------ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //------>8------- end kyopro_library/base/include.hpp -------->8------ //------>8------- begin kyopro_library/base/macro.hpp -------->8------ #define rep1(n) for(ii i = 0; i < (n); i++) #define rep2(i, n) for(ii i = 0; i < (n); i++) #define rep3(i, a, b) for(ii i = (a); i < (b); i++) #define rep4(i, a, b, c) for(ii i = (a); i < (b); i += (c)) #define rep_overload(a, b, c, d, e, ...) e #define rep(...) rep_overload(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define per1(n) for(ii i = (n) - 1; i >= 0; i--) #define per2(i, n) for(ii i = (n) - 1; i >= 0; i--) #define per3(i, a, b) for(ii i = (b) - 1; i >= (a); i--) #define per4(i, a, b, c) for(ii i = (b) - 1; i >= (a); i -= (c)) #define per_overload(a, b, c, d, e, ...) e #define per(...) per_overload(__VA_ARGS__, per4, per3, per2, per1)(__VA_ARGS__) #define fore(x, a) for(auto& x : a) #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define QYN(q, a, b) ((q) ? (a) : (b)) #define pb push_back #define eb emplace_back #define mkp make_pair #define mkt make_tuple #define fi first #define se second #define vv(type, name, a, ...) \ vector> name(a, vector(__VA_ARGS__)) #define vvv(type, name, a, b, ...) \ vector>> name( \ a, vector>(b, vector(__VA_ARGS__))) #define vvvv(type, name, a, b, c, ...) \ vector>>> name( \ a, vector>>( \ b, vector>(c, vector(__VA_ARGS__)))) #define vvvvv(type, name, a, b, c, d, ...) \ vector>>>> name( \ a, vector>>>( \ b, vector>>( \ c, vector>(d, vector(__VA_ARGS__))))) #define applyv(v, f) \ [&]() { \ auto&& _v = (v); \ for(auto& x : _v) \ f(x); \ }() #define mapv(v, f) \ [&]() { \ auto&& _v = (v); \ using Type = std::decay_t; \ std::vector ret; \ ret.reserve(_v.size()); \ for(const auto& x : _v) \ ret.push_back(f(x)); \ return ret; \ }() #define II(...) \ ii __VA_ARGS__; \ input(__VA_ARGS__) #define LL(...) \ ll __VA_ARGS__; \ input(__VA_ARGS__) #define IDX(...) \ ii __VA_ARGS__; \ input(__VA_ARGS__); \ input_index(__VA_ARGS__) #define STR(...) \ string __VA_ARGS__; \ input(__VA_ARGS__); #define CHR(...) \ char __VA_ARGS__; \ input(__VA_ARGS__); #define LD(...) \ ld __VA_ARGS__; \ input(__VA_ARGS__); #define VI(A, N) \ vector A(N); \ input(A); #define VVI(A, N, M) \ vector> A(N, vector(M)); \ input(A); #define VL(A, N) \ vector A(N); \ input(A); #define VVL(A, N, M) \ vector> A(N, vector(M)); \ input(A); #define VPI(A, N) \ vpi A(N); \ input(A); #define VTI(A, N) \ vti A(N); \ input(A); #define VI2(A, B, N) \ vector A(N), B(N); \ rep(i, N) cin >> A[i] >> B[i]; #define VL2(A, B, N) \ vector A(N), B(N); \ rep(i, N) cin >> A[i] >> B[i]; #define VI3(A, B, C, N) \ vector A(N), B(N), C(N); \ rep(i, N) cin >> A[i] >> B[i] >> C[i]; #define VL3(A, B, C, N) \ vector A(N), B(N), C(N); \ rep(i, N) cin >> A[i] >> B[i] >> C[i]; #define VST(A, N) \ vector A(N); \ input(A); #define IN2(A, B) rep(i, siz(A)) cin >> A[i] >> B[i]; #define IN3(A, B, C) rep(i, siz(A)) cin >> A[i] >> B[i] >> C[i]; #define IN4(A, B, C, D) rep(i, siz(A)) cin >> A[i] >> B[i] >> C[i] >> D[i]; #define IN5(A, B, C, D, E) \ rep(i, siz(A)) cin >> A[i] >> B[i] >> C[i] >> D[i] >> E[i]; //------>8-------- end kyopro_library/base/macro.hpp --------->8------ //------>8-------- begin kyopro_library/base/type.hpp -------->8------ using i16 = short; using i32 = int; using i64 = long long; using i128 = __int128_t; using u16 = unsigned short; using u32 = unsigned int; using u64 = unsigned long long; using u128 = __uint128_t; using f64 = double; using f80 = long double; using ii = i64; using ll = i64; using ull = u64; using vi = vector; using vvi = vector>; using vvvi = vector>>; using vl = vector; using vvl = vector>; using vvvl = vector>>; using ii3 = array; using ii4 = array; using ii5 = array; using lll = i128; using ulll = u128; constexpr lll operator""_lll(ull x) { return static_cast(x); } using ld = f80; using str = string; using vstr = vector; template using V = vector; template using VV = vector>; template using VVV = vector>>; template using VVVV = vector>>>; template using VVVVV = vector>>>>; template using VVVVVV = vector>>>>>; template using max_pq = priority_queue; template using min_pq = priority_queue, greater>; template using unset = unordered_set; template using unmap = unordered_map; template struct PR : pair { template PR(Args... args) : pair(args...) {} using pair::first; using pair::second; PR& operator+=(const PR& r) { first += r.first; second += r.second; return *this; } PR& operator-=(const PR& r) { first -= r.first; second -= r.second; return *this; } PR& operator*=(const PR& r) { first *= r.first; second *= r.second; return *this; } template PR& operator+=(const S& r) { first += r; second += r; return *this; } template PR& operator-=(const S& r) { first -= r; second -= r; return *this; } template PR& operator*=(const S& r) { first *= r; second *= r; return *this; } PR operator+(const PR& r) const { return PR(*this) += r; } PR operator-(const PR& r) const { return PR(*this) -= r; } PR operator*(const PR& r) const { return PR(*this) *= r; } template PR operator+(const S& r) const { return PR(*this) += r; } template PR operator-(const S& r) const { return PR(*this) -= r; } template PR operator*(const S& r) const { return PR(*this) *= r; } PR operator-() const { return PR{-first, -second}; } }; using pi = PR; using vpi = vector; using vvpi = vector>; using pl = PR; using vpl = vector; using vvpl = vector>; template struct TR : tuple { using tuple::tuple; T& x = get<0>(*this); U& y = get<1>(*this); V& z = get<2>(*this); TR() : tuple() {} TR(const T& a, const U& b, const V& c) : tuple(a, b, c) {} TR(const TR& other) : tuple(other), x(get<0>(*this)), y(get<1>(*this)), z(get<2>(*this)) {} TR(TR&& other) noexcept : tuple(move(other)), x(get<0>(*this)), y(get<1>(*this)), z(get<2>(*this)) {} TR& operator=(const TR& other) { tuple::operator=(other); return *this; } TR& operator=(TR&& other) noexcept { tuple::operator=(move(other)); return *this; } }; using ti = TR; using vti = vector; using vvti = vector>; using tl = TR; using vtl = vector; using vvtl = vector>; const i32 INF = 1e9 + 10; const i64 INFL = 4e18; const i128 INFLL = 1_lll << 120; template constexpr T inf = 0; template <> constexpr i32 inf = INF; template <> constexpr i64 inf = INFL; template <> constexpr i128 inf = INFLL; template <> constexpr u32 inf = INF; template <> constexpr u64 inf = INFL; template <> constexpr u128 inf = INFLL; template <> constexpr f64 inf = numeric_limits::infinity(); template <> constexpr f80 inf = numeric_limits::infinity(); istream& operator>>(istream& is, lll& x) { int c = is.peek(); while(c == ' ' || c == '\n') is.get(), c = is.peek(); bool neg = false; if(c == '-') neg = true, is.get(); x = 0; while(isdigit(is.peek())) x = x * 10 + is.get() - '0'; if(neg) x = -x; return is; } ostream& operator<<(ostream& os, lll x) { if(x < 0) os << '-', x = -x; if(x == 0) return os << '0'; string s; while(x > 0) s += x % 10 + '0', x /= 10; reverse(s.begin(), s.end()); return os << s; } #ifdef TDY lll abs(lll x) { if(x < 0) return -x; return x; } lll gcd(lll a, lll b) { while(b) a %= b, swap(a, b); return a; } #endif //------>8--------- end kyopro_library/base/type.hpp --------->8------ //------>8--------- begin kyopro_library/base/io.hpp --------->8------ const char NL = '\n'; void flush() { cout.flush(); } inline string YesNo(bool f) { return f ? "Yes" : "No"; } inline string YESNO(bool f) { return f ? "YES" : "NO"; } template istream& operator>>(istream& is, vector>& v) { for(auto& x : v) for(auto& y : x) is >> y; return is; } template istream& operator>>(istream& is, vector& v) { for(auto& x : v) is >> x; return is; } template istream& operator>>(istream& is, pair& p) { is >> p.first >> p.second; return is; } template void input(T&... a) { (cin >> ... >> a); } template void input_index(T& a) { a--; } template void input_index(T& a, Ts&... b) { a--; input_index(b...); } template ostream& operator<<(ostream& os, const pair& p) { os << p.fi << ' ' << p.se; return os; } template ostream& operator<<(ostream& os, const PR& p) { os << p.fi << ' ' << p.se; return os; } template ostream& operator<<(ostream& os, const tuple& t) { os << ' ' << get<0>(t) << ' ' << get<1>(t) << ' ' << get<2>(t); return os; } template ostream& operator<<(ostream& os, const TR& t) { os << ' ' << get<0>(t) << ' ' << get<1>(t) << ' ' << get<2>(t); return os; } template ostream& operator<<(ostream& os, const tuple& t) { os << ' ' << get<0>(t) << ' ' << get<1>(t) << ' ' << get<2>(t) << ' ' << get<3>(t); return os; } template ostream& operator<<(ostream& os, const vector>>& a) { int I = a.size(); for(int i = 0; i < I; i++) { int J = a[i].size(); for(int j = 0; j < J; j++) { int K = a[i][j].size(); for(int k = 0; k < K; k++) { os << a[i][j][k]; if(k != K - 1) os << ' '; } os << NL; } if(i != I - 1) os << NL; } return os; } template ostream& operator<<(ostream& os, const vector>& a) { int I = a.size(); for(int i = 0; i < I; i++) { int J = a[i].size(); for(int j = 0; j < J; j++) { os << a[i][j]; if(j != J - 1) os << ' '; } if(i != I - 1) cout << NL; } return os; } template ostream& operator<<(ostream& os, const vector& a) { int n = a.size(); for(int i = 0; i < n; i++) { os << a[i]; if(i != n - 1) os << ' '; } return os; } template ostream& operator<<(ostream& os, const set& a) { for(auto itr = a.begin(); itr != a.end(); itr++) { os << *itr; if(next(itr) != a.end()) os << ' '; } return os; } template ostream& operator<<(ostream& os, const multiset& a) { for(auto itr = a.begin(); itr != a.end(); itr++) { os << *itr; if(next(itr) != a.end()) os << ' '; } return os; } template ostream& operator<<(ostream& os, const deque& a) { for(auto itr = a.begin(); itr != a.end(); itr++) { os << *itr; if(next(itr) != a.end()) os << ' '; } return os; } template ostream& operator<<(ostream& os, queue a) { while(!a.empty()) { os << a.front(); a.pop(); if(a.size()) os << ' '; } return os; } template ostream& operator<<(ostream& os, priority_queue a) { while(!a.empty()) { os << a.top(); a.pop(); if(a.size()) os << ' '; } return os; } template ostream& operator<<(ostream& os, priority_queue, greater> a) { while(!a.empty()) { os << a.top(); a.pop(); if(a.size()) os << ' '; } return os; } template ostream& operator<<(ostream& os, array a) { for(int i = 0; i < N; i++) { os << a[i]; if(i != N - 1) os << ' '; } return os; } template void put(const T& a, const Ts&... b) { cout << a; (void)(cout << ... << b); } template void line(const T& a, const Ts&... b) { cout << a; (void)(cout << ... << (cout << ' ', b)); cout << ' '; } void say() { cout << '\n'; } template void say(const T& a, const Ts&... b) { cout << a; (void)(cout << ... << (cout << ' ', b)); cout << '\n'; } #define O(...) \ { \ say(__VA_ARGS__); \ return; \ } //------>8---------- end kyopro_library/base/io.hpp ---------->8------ //------>8-------- begin kyopro_library/base/util.hpp -------->8------ template inline ii siz(const T& v) { return v.size(); } template A amin(A a, B b) { if(a > b) return b; return a; } template A amax(A a, B b) { if(a < b) return b; return a; } template bool chmin(A& a, B b) { if(a > b) { a = b; return true; } return false; } template bool chmax(A& a, B b) { if(a < b) { a = b; return true; } return false; } template T minv(const vector& v) { if(v.empty()) return inf; return *ranges::min_element(v); } template T maxv(const vector& v) { if(v.empty()) return -inf; return *ranges::max_element(v); } template T sumv(const vector& v) { return reduce(v.begin(), v.end()); } template ii minidx(const vector& v) { return ranges::min_element(v) - v.begin(); } template ii maxidx(const vector& v) { return ranges::max_element(v) - v.begin(); } template ii lob(const vector& v, const T& x) { return ranges::lower_bound(v, x) - v.begin(); } template ii upb(const vector& v, const T& x) { return ranges::upper_bound(v, x) - v.begin(); } template ii find(const vector& v, const T& x) { for(ii i = 0; i < siz(v); i++) if(v[i] == x) return i; return siz(v); } template ii find_last(const vector& v, const T& x) { for(ii i = siz(v) - 1; i >= 0; i--) if(v[i] == x) return i; return -1; } template void unique(vector& v) { ranges::sort(v); v.erase(unique(v.begin(), v.end()), v.end()); } template vector compress(vector v) { auto w = v; unique(w); for(T& x : v) x = lob(w, x); return v; } ii countv(const auto& a, auto v) { return count(a.begin(), a.end(), v); } void insertv(auto& a, ii idx, auto v) { assert(idx <= siz(a)); a.insert(a.begin() + idx, v); } void erasev(auto& a, ii idx) { assert(idx < siz(a)); a.erase(a.begin() + idx); } // 先頭をoffset個分後ろに void rotatebackv(auto& a, ii offset) { offset %= siz(a); rotate(a.begin(), a.end() - offset, a.end()); } // 末尾をoffset個分前の方に void rotatefrontv(auto& a, ii offset) { offset %= siz(a); rotate(a.begin(), a.begin() + offset, a.end()); } auto mkinsert(const auto& a, ii idx, auto v) { auto b = a; insertv(b, idx, v); return b; } auto mkerase(const auto& a, ii idx) { auto b = a; erasev(b, idx); return b; } auto mkpush(const auto& a, auto v) { auto b = a; b.push_back(v); return b; } template V mkslice(const V& a, ii l, ii r) { assert(l <= r && l >= 0 && r <= siz(a)); V b(a.begin() + l, a.begin() + r); return b; } template V mkconcat(const V& a, const V& b) { auto ret = a; ret.reserve(siz(a) + siz(b)); for(auto x : b) ret.push_back(x); return ret; } template vector> zip(const vector& a, const vector& b) { ii n = siz(a); vector> ret(n); for(ii i = 0; i < n; i++) ret[i] = {a[i], b[i]}; return ret; } template vector> zip(const vector& a, const vector& b, const vector& c) { ii n = siz(a); vector> ret(n); for(ii i = 0; i < n; i++) ret[i] = {a[i], b[i], c[i]}; return ret; } template PR, vector> unzip(const vector>& p) { ii n = siz(p); vector reta(n); vector retb(n); for(ii i = 0; i < n; i++) { reta[i] = p[i].first; retb[i] = p[i].second; } return mkp(reta, retb); } template TR, vector, vector> unzip(const vector>& p) { ii n = siz(p); vector reta(n); vector retb(n); vector retc(n); for(ii i = 0; i < n; i++) { auto [a, b, c] = p[i]; reta[i] = a; retb[i] = b; retc[i] = c; } return mkt(reta, retb, retc); } template T pick(max_pq& v) { T ret = v.top(); v.pop(); return ret; } template T pick(min_pq& v) { T ret = v.top(); v.pop(); return ret; } template T pick(queue& v) { T ret = v.front(); v.pop(); return ret; } template T pick(vector& v) { T ret = v.back(); v.pop_back(); return ret; } template T pickf(deque& v) { T ret = v.front(); v.pop_front(); return ret; } template T pickb(deque& v) { T ret = v.back(); v.pop_back(); return ret; } template bool nxperm(T& v) { return next_permutation(v.begin(), v.end()); } template void operator++(V& a, T) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr)++; } template void operator--(V& a, T) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr)--; } template void operator+=(V& a, auto x) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr) += x; } template void operator-=(V& a, auto x) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr) -= x; } template void operator*=(V& a, auto x) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr) *= x; } template void operator/=(V& a, auto x) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr) /= x; } template void operator%=(V& a, auto x) { for(auto itr = a.begin(); itr != a.end(); itr++) (*itr) %= x; } template T myfloor(T a, T b) { assert(b != 0); if(b < 0) a = -a, b = -b; return a / b - (a % b < 0); } template T myceil(T a, T b) { assert(b != 0); if(b < 0) a = -a, b = -b; return a / b + (a % b > 0); } template T mymod(T a, T b) { assert(b != 0); if(b < 0) b = -b; if(a > 0) return a % b; return (a % b + b) % b; } template vector mksum(const vector& v) { ii n = v.size(); vector ret(n + 1); for(ii i = 0; i < n; i++) ret[i + 1] = ret[i] + v[i]; return ret; } template vector mkpmax(const vector& v) { ii n = v.size(); vector ret(n + 1, -inf); for(ii i = 0; i < n; i++) ret[i + 1] = max(ret[i], v[i]); return ret; } template vector mkpmin(const vector& v) { ii n = v.size(); vector ret(n + 1, inf); for(ii i = 0; i < n; i++) ret[i + 1] = min(ret[i], v[i]); return ret; } vi mkiota(ii n) { vi ret(n); iota(ret.begin(), ret.end(), 0); return ret; } template V mkrev(V A) { reverse(A.begin(), A.end()); return A; } template vi mkinv(const V& A) { ii n = siz(A); vi ret(maxv(A) + 1); for(ii i = 0; i < n; i++) ret[A[i]] = i; return ret; } template vvi mkinvvec(const V& A) { ii n = siz(A); vvi ret(maxv(A) + 1); for(ii i = 0; i < n; i++) ret[A[i]].push_back(i); return ret; } template vi mkcount(const V& A) { ii n = siz(A); vi ret(maxv(A) + 1); for(ii i = 0; i < n; i++) ret[A[i]]++; return ret; } template vi argsort(const V& A) { vi idx = mkiota(siz(A)); sort(idx.begin(), idx.end(), [&](ii i, ii j) { return (A[i] == A[j] ? i < j : A[i] < A[j]); }); return idx; } template ii digsiz(T n) { ii ret = 0; while(n) { ret++; n /= 10; } return ret; } template vector digits(T n) { vector ret; while(n) { ret.push_back(n % 10); n /= 10; } reverse(ret.begin(), ret.end()); return ret; } i64 tenpow(ii r) { i64 ret = 1; while(r--) ret *= 10; return ret; } i64 intpow(i64 x, i64 r) { i64 ret = 1; while(r--) ret *= x; return ret; } template T intsqrt(T x) { ll sq = (T)sqrtl(ld(x)); while(sq * sq > x) sq--; while((sq + 1) * (sq + 1) <= x) sq++; return sq; } ii ctoi(char c) { assert('0' <= c && c <= '9'); return c - '0'; } //------>8--------- end kyopro_library/base/util.hpp --------->8------ void run(); void prep(); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); prep(); #ifdef MULTI II(T); rep(t, T) { #ifdef TDY cerr << "============ Case: #" << t + 1 << " ============" << endl; #endif run(); } #else run(); #endif } #ifdef DEBUG #include "./debug.hpp" #else #define debug(...) #define print_line #endif //------>8--------- end kyopro_library/template.hpp ---------->8------ //------>8- begin kyopro_library/algorithm/binary_search.hpp ->8------ /// @brief 二分探索 /// @details 条件 judge を満たす ok と ng の境界を二分探索によって求める。 /// @note O(log(|ok - ng|) * f) template T BinarySearch(T ok, T ng, Judge judge) { while(abs(ok - ng) > 1) { T mid = (ok + ng) / 2; if(judge(mid)) ok = mid; else ng = mid; } return ok; } /// @brief 回数指定二分探索 /// @details 条件 judge を満たす ok と ng の境界を二分探索によって求める。 /// @note O(iter * f) template T BinarySearchIteration(T ok, T ng, Judge judge, ii iter = 100) { while(iter--) { T mid = (ok + ng) / 2; if(judge(mid)) ok = mid; else ng = mid; } return ok; } /// @brief 単調性の確認 /// @details 関数 judge が単調性を満たすか否かを確認する /// @param start 開始要素 /// @param step 探索幅 /// @param iter 探索回数 template bool CheckMonotonicity(T start, T step, ii iter, Judge judge) { cerr << "[ "; bool pre = false; ll cnt = 0; for(T i = start; iter > 0; iter--, i += step) { bool tmp = judge(i); cerr << "{ " << i << " : " << (tmp ? "OK" : "NG") << " }, "; if(i != start && tmp != pre) cnt++; pre = tmp; } cerr << " ]\n"; if(cnt <= 1) cerr << "Is Monotonic" << NL; else cerr << "Not Monotonic" << NL; return cnt <= 1; } //------>8-- end kyopro_library/algorithm/binary_search.hpp -->8------ //------>8------------------------------------------->8------ /* */ void run() { LL(N, X, Y, A, B); if(N <= 10) { auto f = [&](pi xy) -> pi { auto [x, y] = xy; if(x + y < 0) return pi{x + A, y}; else return pi{x, y - B}; }; auto calc = [&](auto&& calc, ii n, pi xy) -> pi { if(n == 1) return f(xy); return f(calc(calc, n - 1, xy)); }; auto [x, y] = calc(calc, N, {X, Y}); O(x, y); } else if(A > 0 && B > 0) { ll k = BinarySearch(-1, N + 1, [&](ii m) { ll x = X + m * A, y = Y - (N - m) * B; ll val = x + y; return val <= A; }); O(X + k * A, Y - (N - k) * B); } exit(1); } void prep() {} // code.cpp