Submission #71310763


Source Code Expand

/* #region */
#ifdef ONLINE_JUDGE
    #pragma GCC optimize("O3,unroll-loops")
    // #pragma GCC target("sse,sse2,sse3,ssse3,fma,abm,mmx,bmi,bmi2,popcnt,lzcnt")
    // #pragma GCC target("avx2") // CF, CodeChef, HOJ ではコメントアウト
#endif
#include <bits/extc++.h>
// #include <atcoder/all>
// using namespace atcoder;
using namespace std;
using namespace __gnu_pbds;

// #include <boost/multiprecision/cpp_dec_float.hpp>
// #include <boost/multiprecision/cpp_int.hpp>
// namespace mp = boost::multiprecision;
// using lll = mp::cpp_int;
// using lld = mp::cpp_dec_float_50; // 十進50桁. ldは19桁.
// // using lld = mp::cpp_dec_float_100;
// // using lld = mp::number<mp::cpp_dec_float<200>>;
// lld Beps = 0.00000000000000000000000000000001; // 1e-32
// const bool equals(lld a, lld b) { return mp::fabs(a - b) < Beps; }

#define pb emplace_back
#define int ll
#define endl '\n'

using ll = long long;
using ld = long double;
const ld PI = acosl(-1);
const int INF = 1 << 30;
const ll INFL = 1LL << 61;
const int MOD = 998244353;
// const int MOD = 1000000007;

const ld EPS = 1e-10;

const vector<int> dx = {0, 1, 0, -1, 1, 1, -1, -1, 0}; // → ↓ ← ↑ ↘ ↙ ↖ ↗ 自
const vector<int> dy = {1, 0, -1, 0, 1, -1, -1, 1, 0};

template<typename T>
struct Edge {
    int from, to;
    T cost;
    Edge() {}
    Edge(int to, T cost) : from(-1), to(to), cost(cost) {}
    Edge(int from, int to, T cost) : from(from), to(to), cost(cost) {}
    bool operator ==(const Edge &e) const {
        return this->from == e.from && this->to == e.to && this->cost == e.cost;
    }
    bool operator !=(const Edge &e) const {
        return this->from != e.from or this->to != e.to or this->cost != e.cost;
    }
    bool operator <(const Edge &e) const { return this->cost < e.cost; }
    bool operator >(const Edge &e) const { return this->cost > e.cost; }
};

chrono::system_clock::time_point start;
__attribute__((constructor))
void constructor() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(10);
    start = chrono::system_clock::now();
}

namespace bit_function {
    using i64 = ll;
    // using i64 = uint64_t;
    // 区間は [l, r)
    i64 lrmask(int l, int r) { return (1LL << r) - (1LL << l); }
    i64 sub_bit(i64 x, int l, int r) { i64 b = x & ((1LL << r) - (1LL << l)); return b >> l; } // r溢れ可
    i64 bit_width(i64 x) { return (x == 0) ? 1 : 64 - __builtin_clzll(x); }

    i64 popcount(i64 x) { return __builtin_popcountll(x); }
    i64 popcount(i64 x, int l, int r) { return __builtin_popcountll(sub_bit(x, l, r)); }
    i64 unpopcount(i64 x) { return bit_width(x) - __builtin_popcountll(x); } // 最上位bitより下のみ
    i64 unpopcount(i64 x, int l, int r) { return r - l - __builtin_popcountll(sub_bit(x, l, r)); } // 最上位bitより上も含まれうる
    bool is_pow2(i64 x) { return __builtin_popcountll(x) == 1; }
    bool is_pow4(i64 x) { return __builtin_popcountll(x) == 1 && __builtin_ctzll(x) % 2 == 0; }

    int top_bit(i64 x) { return (x == 0) ? -1 : 63 - __builtin_clzll(x); }
    int bot_bit(i64 x) { return (x == 0) ? -1 : __builtin_ctzll(x); }
    i64 msb(i64 x) { return (x == 0) ? 0 : 1LL << (63 - __builtin_clzll(x)); } // mask
    i64 lsb(i64 x) { return (x & -x); } // mask

    int next_bit(i64 x, int k) {
        i64 mask = x & ~((1LL << (k + 1)) - 1); // k+1桁目以上のビットのみ残す
        return (mask == 0) ? -1 : __builtin_ctzll(mask);
    }
    int prev_bit(i64 x, int k) {
        i64 mask = x & ((1LL << k) - 1); // k桁目未満のビットのみ残す
        return (mask == 0) ? -1 : 63 - __builtin_clzll(mask);
    }
    int kth_bit(int x, int k) { // 下からk番目の1の位置。kは1-indexed, 位置は0-indexed
        int pos = 0, cnt = 0;
        while (x > 0) {
            if ((x & 1) && (++cnt == k)) return pos;
            x >>= 1; pos++;
        }
        return -1;
    }

    int countl_zero(i64 x) { return (x == 0) ? 64 : __builtin_clzll(x); }
    int countr_zero(i64 x) { return (x == 0) ? 64 : __builtin_ctzll(x); }

    int countl_one(i64 x) { // std::countl_oneと定義が異なるので注意
        if (x == 0) return 0;
        i64 ret = 0, k = 63 - __builtin_clzll(x);
        while (k != -1 && (x & (1LL << k))) { k--; ret++; }
        return ret;
    }
    int countr_one(i64 x) { return (x == 0) ? 0 : __builtin_popcount(x ^ (x & -~x)); }

    i64 l_one_mask(i64 x) { // 最上位で連なってる1のmask
        int cnt = countl_one(x);
        return (cnt == 0) ? 0 : (x & (~((1LL << (bit_width(x) - cnt)) - 1)));
    }
    i64 r_one_mask(i64 x) { // 最下位で連なってる1のmask
        int cnt = countr_one(x);
        return (cnt == 0) ? 0 : (x & ((1LL << cnt) - 1));
    }

    int floor_log2(i64 x) { assert(x > 0); return 63 - __builtin_clzll(x); } // top_bit
    int ceil_log2(i64 x) { assert(x > 0); return 64 - __builtin_clzll(x - 1); }
    i64 bit_floor(i64 x) { if (x == 0) return 0; return 1LL << (63 - __builtin_clzll(x)); } // msb
    i64 bit_ceil(i64 x) { if (x == 0) return 0; return 1LL << (64 - __builtin_clzll(x - 1)); }

    i64 rotl(i64 x, int k) { // 有効bit内でrotate. オーバーフロー注意
        i64 w = bit_width(x); k = ((k % w) + w) % w;
        return ((x << k) | (x >> (w - k))) & ((1LL << w) - 1);
    }
    i64 rotr(i64 x, int k) {
        i64 w = bit_width(x); k = ((k % w) + w) % w;
        return ((x >> k) | (x << (w - k))) & ((1LL << w) - 1);
    }
    i64 bit_reverse(i64 x) { // 有効bit内で左右反転
        i64 r = 0, w = bit_width(x);
        for (i64 i = 0; i < w; i++) r |= ((x >> i) & 1) << (w - i - 1);
        return r;
    }

    bool is_palindrome(i64 x) { return x == bit_reverse(x); }
    bool is_palindrome(i64 x, int l, int r) { i64 b = sub_bit(x, l, r); return b == bit_reverse(b); }
    i64 concat(i64 a, i64 b) { return (a << bit_width(b)) | b; } // オーバーフロー注意
    i64 erase(i64 x, int l, int r) { return (x >> r << l) | (x & ((1LL << l) - 1)); } // [l, r) をカット

    i64 hamming(i64 a, i64 b) { return __builtin_popcountll(a ^ b); }
    i64 hamming(i64 a, i64 b, int l, int r) { return __builtin_popcountll(sub_bit(a, l, r) ^ sub_bit(b, l, r)); }
    i64 compcount(i64 x) { return (__builtin_popcountll(x ^ (x >> 1)) + (x & 1)) / 2; }
    i64 compcount2(i64 x) { return compcount(x & (x >> 1)); } // 長さ2以上の連結成分の個数
    i64 adjacount(i64 x) { return __builtin_popcountll(x & (x >> 1)); } // 隣接する1のペアの個数

    i64 next_combination(i64 x) {
        assert(x != 0);
        i64 t = x | (x - 1); return (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctzll(x) + 1));
    }

    vector<int> popvec(i64 x) {
        vector<int> ret;
        i64 b = 1;
        for (int k = 0; x >= b; k++, b <<= 1) {
            if (x & b) ret.push_back(k);
        }
        return ret;
    }
} using namespace bit_function;

namespace util {
    bool equals(ld a, ld b) { return fabs((a) - (b)) < EPS; }

    __int128_t POW(__int128_t x, int n) {
        assert(n >= 0);
        __int128_t ret = 1;
        while (n > 0) {
            if (n & 1) ret *= x;
            if (n == 1) break;
            x *= x;
            n >>= 1;
        }
        return ret;
    }

    int per(int x, int y) { // x = qy + r (0 <= r < y) を満たすq
        assert(y != 0);
        if (x >= 0 && y > 0) return x / y;
        if (x >= 0 && y < 0) return x / y;
        if (x < 0 && y < 0) return x / y + (x % y < 0);
        return x / y - (x % y < 0); //  (x < 0 && y > 0)
    }
    int mod(int x, int y) { // x = qy + r (0 <= r < y) を満たすr
        assert(y != 0);
        return x - y * per(x, y);
    } // https://yukicoder.me/problems/no/2781
    int floor(int x, int y) { // (ld)x / y 以下の最大の整数
        assert(y != 0);
        if (y < 0) x = -x, y = -y;
        return x >= 0 ? x / y : (x + 1) / y - 1;
    }
    int ceil(int x, int y) { // (ld)x / y 以上の最小の整数
        assert(y != 0);
        if (y < 0) x = -x, y = -y;
        return x > 0 ? (x - 1) / y + 1 : x / y;
    }
    int round(int x, int y) { // (ld)x / y を小数第1位について四捨五入
        assert(y != 0);
        if (x*y < 0) return -((abs(x) * 2 + abs(y)) / (abs(y) * 2)); // https://www.acmicpc.net/problem/2108
        return (x * 2 + y) / (y * 2);
    }
    int round(int x, int y, int k) { // (ld)x / y を10^kの位に関して四捨五入
        assert(y != 0 && k >= 0);
        if (k == 0) return (x * 2 + y) / (y * 2);
        x /= y * POW(10, k - 1);
        if (x % 10 >= 5) return (x + 10 - x % 10) * POW(10, k - 1);
        return x * POW(10, k - 1);
    }
    int round2(int x, int y) { // 五捨五超入 // 未verify
        assert(y != 0);
        if (y < 0) y = -y, x = -x;
        int z = x / y;
        if ((z * 2 + 1) * y <= y * 2) z++;
        return z;
    }
    int floor(ld x) { // 未.  負数でも小さい方に丸める
        if (x > -EPS) return (int)(floorl(x + EPS) + EPS);
        return -(int)((ceill(-x - EPS)) + EPS);
    }
    int ceil(ld x) { // 未.  負数でも大きい方に丸める
        if (x > EPS) return (int)(ceill(x - EPS) + EPS);
        return -(int)((floorl(-x + EPS)) + EPS);
    }
    int round(ld x) { // 未. 負数でも.5の場合は大きい方に丸める
        if (x > EPS) return (int)(std::round(x + EPS) + EPS);
        return (int)(std::round(x + EPS) - EPS);
    }
    // int get(ld x, int k) { // 未. xの10^kの位の桁
    // }
    ld floor(ld x, int k) { // xを10^kの位に関してflooring
        ld d = pow(10, -k);
        return util::floor(x * d) / d; // 未verify
    }
    ld ceil(ld x, int k) { // xを10^kの位に関してceiling
        ld d = pow(10, -k);
        return util::ceil(x * d) / d; // 未verify
    }
    ld round(ld x, int k) { // xを10^kの位に関して四捨五入.
        ld d = pow(10, -k);
        return util::round(x * d) / d;
    }
    // int kth(int x, int y, int k) { // x / yの10^kの位の桁
    // }
    int floor(ld x, ld y) { // 誤差対策TODO
        assert(!equals(y, 0));
        return std::floor(x / y);
        // floor(x) = ceil(x - 1) という話も
    }
    int ceil(ld x, ld y) { // 誤差対策TODO // ceil(p/q) = -floor(-(p/q))らしい
        assert(!equals(y, 0));
        return std::ceil(x / y);
        // ceil(x) = floor(x + 1)
    }
    int perl(ld x, ld y) { // x = qy + r (0 <= r < y, qは整数) を満たす q
        // 未verify. 誤差対策TODO. EPS外してもいいかも。
        assert(!equals(y, 0));
        if (x >= 0 && y > 0) return std::floor(x / y) + EPS;
        if (x >= 0 && y < 0) return -std::floor(x / fabs(y));
        if (x < 0 && y < 0) return std::floor(x / y) + (x - std::floor(x/y)*y < -EPS);
        return std::floor(x / y) - (x - std::floor(x/y)*y < -EPS); //  (x < 0 && y > 0)
    }
    ld modl(ld x, ld y) { // x = qy + r (0 <= r < y, qは整数) を満たす r
        // 未verify. 誤差対策TODO. -0.0が返りうる。
        assert(!equals(y, 0));
        if (x >= 0) return x - fabs(y)*fabs(perl(x, y));
        return x - fabs(y)*floor(x, fabs(y));
    }
    int seisuu(ld x) { return (int)x; } // 整数部分. 誤差対策TODO
    int modf(ld x) {
        if (x < 0) return util::ceil(x);
        else return util::floor(x);
    }
    // 正なら+EPS, 負なら-EPSしてから、文字列に直して小数点以下を捨てる?
    int seisuu(int x, int y) {
        assert(y != 0);
        return x / y;
    }
    int seisuu(ld x, ld y) { // 誤差対策TODO
        assert(!equals(y, 0));
        return (int)(x / y);
    }

    int floor_log(int base, int x) { // log_base{x} のfloor
        assert(base >= 2);
        int ret = 0, now = 1;
        while (now <= x) {
            now *= base;
            if (now <= x) ret++;
        }
        return ret;
    }
    int ceil_log(int base, int x) { // log_base{x} のceil
        assert(base >= 2);
        int ret = 0, now = 1;
        while (now < x) {
            now *= base;
            ret++;
        }
        return ret;
    }

    template <class T> pair<T, T> max(const pair<T, T> &a, const pair<T, T> &b) {
        if (a.first > b.first or a.first == b.first && a.second > b.second) return a;
        return b;
    }
    template <class T> pair<T, T> min(const pair<T, T> &a, const pair<T, T> &b) {
        if (a.first < b.first or a.first == b.first && a.second < b.second) return a;
        return b;
    }

    template <class T> bool chmax(T &a, const T &b) {
        if (a < b) { a = b; return true; } return false;
    }
    template <class T> bool chmin(T &a, const T &b) {
        if (a > b) { a = b; return true; } return false;
    }
    template <class T> bool chmax(pair<T, T> &a, const pair<T, T> &b) {
        if (a.first < b.first or a.first == b.first && a.second < b.second) { a = b; return true; }
        return false;
    }
    template <class T> bool chmin(pair<T, T> &a, const pair<T, T> &b) {
        if (a.first > b.first or a.first == b.first && a.second > b.second) { a = b; return true; }
        return false;
    }
    template <class T> T mid(T a, T b, T c) { // 誤差対策TODO
        return a + b + c - std::max({a, b, c}) - std::min({a, b, c});
    }

    template <typename T, typename... Args>
    void Sort(T& a, T& b, Args&... args) {
        vector<T> vec = {a, b, args...};
        sort(vec.begin(), vec.end());
        auto it = vec.begin();
        a = *it++; b = *it++;
        int dummy[] = {0, (args = *it++, 0)...};
        static_cast<void>(dummy);
    }
    template <typename T, typename... Args>
    void Sortr(T& a, T& b, Args&... args) {
        vector<T> vec = {a, b, args...};
        sort(vec.rbegin(), vec.rend());
        auto it = vec.begin();
        a = *it++; b = *it++;
        int dummy[] = {0, (args = *it++, 0)...};
        static_cast<void>(dummy);
    }

    template <class T>
    void sort(vector<T> &A, vector<T> &B) {
        vector<pair<T, T>> P(A.size());
        for (int i = 0; i < (int)A.size(); i++) P[i] = {A[i], B[i]};
        sort(P.begin(), P.end());
        for (int i = 0; i < (int)A.size(); i++) A[i] = P[i].first, B[i] = P[i].second;
    }

    istream &operator >>(istream &is, __int128_t& x) {
        string S; is >> S;
        __int128_t ret = 0;
        bool neg = false;
        if (S[0] == '-') neg = true;
        for (int i = neg; i < (int)S.size(); i++) {
            ret = ret * 10 + S[i] - '0';
        }
        x = neg ? -ret : ret;
        return is;
    }
    ostream &operator <<(ostream &os, __int128_t x) {
        ostream::sentry s(os);
        if (s) {
            __uint128_t tmp = x < 0 ? -x : x;
            char buffer[128]; char *d = end(buffer);
            do {
                --d; *d = "0123456789"[tmp % 10]; tmp /= 10;
            } while (tmp != 0);
            if (x < 0) { --d; *d = '-'; }
            int len = end(buffer) - d;
            if (os.rdbuf()->sputn(d, len) != len) os.setstate(ios_base::badbit);
        }
        return os;
    }

    __int128_t abs(__int128_t x) {
        return x < 0 ? -x : x;
    }
    __int128_t sto128(const string &S) {
        assert(!S.empty());
        __int128_t ret = 0;
        bool neg = false;
        if (S[0] == '-') neg = true;
        for (int i = neg; i < (int)S.size(); i++) {
            ret = ret * 10 + S[i] - '0';
        }
        return neg ? -ret : ret;
    }
    __int128_t gcd(__int128_t a, __int128_t b) {
        // a = abs(a); b = abs(b);
        return b ? gcd(b, a % b) : a;
    }
    __int128_t lcm(__int128_t a, __int128_t b) {
        if (a == 0 or b == 0) return 0;
        // a = abs(a); b = abs(b);
        return a / gcd(a, b) * b;
        // lcmが__int128_tに収まる必要あり
    }

    string to_string(double x, int k) { // 小数第k+1を四捨五入して小数第k位までを出力
    // 切り捨てがほしい場合は to_string(x, k+1) として pop_back() すればよい?
        assert(k >= 0);
        ostringstream os;
        os << fixed << setprecision(k) << x;
        return os.str();
    }
    string to_string(__int128_t x) {
        if (x == 0) return "0";
        string ret = "";
        bool neg = false;
        if (x < 0) { neg = true; x = -x; }
        while (x) { ret += (char)('0' + x % 10); x /= 10; }
        if (neg) ret += '-';
        reverse(ret.begin(), ret.end());
        return ret;
    }
    string to_string(char c) { return string(1, c); }
} using namespace util;

struct RNG {
    using state_type = uint32_t; // 負数非対応
    using result_type = uint32_t;
    state_type x = 123456789, y = 362436039, z = 521288629, w = 88675123;
    constexpr static double INV_MAX = 1.0 / 0xFFFFFFFF;

    RNG() {
        auto now = chrono::high_resolution_clock::now();
        w = static_cast<state_type>(now.time_since_epoch().count() & 0xFFFFFFFF);
    }
    // RNG(state_type seed = 88675123) : w(seed) {}

    constexpr result_type operator()() {
        state_type t = x ^ (x << 11);
        x = y, y = z, z = w;
        return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
    }

    constexpr result_type _Int(state_type r) { // [0, r)
        return ((uint64_t) (*this)() * r) >> 32;
    }
    constexpr result_type Int(state_type r) { // [0, r]
        return _Int(r + 1);
    }
    constexpr result_type Int(state_type l, state_type r) { // [l, r]
        return _Int(r - l + 1) + l;
    }

    constexpr double prob() { // [0, 1]
        return (*this)() * INV_MAX;
    }
    constexpr double Double(double l, double r) { // [l, r]
        return prob() * (r - l) + l;
    }

    vector<result_type> Seq(int N, state_type l, state_type r) { // [l, r]
        vector<result_type> ret(N);
        for (int i = 0; i < N; i++) ret[i] = _Int(r - l + 1) + l;
        return ret;
    }
    vector<result_type> Perm(int N) {
        vector<result_type> ret(N);
        iota(ret.begin(), ret.end(), 0);
        for (int i = 0; i < N; i++) {
            int j = _Int(N - i) + i;
            swap(ret[i], ret[j]);
        }
        return ret;
    }
    string Str(int N, bool small = true) {
        string ret(N, ' ');
        for (int i = 0; i < N; i++) {
            if (small) ret[i] = (char)Int('a', 'z');
            else ret[i] = (char)Int('A', 'Z');
        }
        return ret;
    }
} rnd;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

template<class T> size_t HashCombine(const size_t seed,const T &v) {
    return seed^(hash<T>()(v)+0x9e3779b9+(seed<<6)+(seed>>2));
}
template<class T,class S> struct hash<pair<T,S>>{
    size_t operator()(const pair<T,S> &keyval) const noexcept {
        return HashCombine(hash<T>()(keyval.first), keyval.second);
    }
};
template<class T> struct hash<vector<T>>{
    size_t operator()(const vector<T> &keyval) const noexcept {
        size_t s=0;
        for (auto&& v: keyval) s=HashCombine(s,v);
        return s;
    }
};
template<int N> struct HashTupleCore{
    template<class Tuple> size_t operator()(const Tuple &keyval) const noexcept{
        size_t s=HashTupleCore<N-1>()(keyval);
        return HashCombine(s,get<N-1>(keyval));
    }
};
template <> struct HashTupleCore<0>{
    template<class Tuple> size_t operator()(const Tuple &keyval) const noexcept{ return 0; }
};
template<class... Args> struct hash<tuple<Args...>>{
    size_t operator()(const tuple<Args...> &keyval) const noexcept {
        return HashTupleCore<tuple_size<tuple<Args...>>::value>()(keyval);
    }
};

template<typename T>
class Compress {
public:
    int sz = 0;
    vector<T> uniqV;

    Compress() = default;

    template<typename... Vecs>
    Compress(const Vecs&... vecs) {
        (uniqV.insert(uniqV.end(), vecs.begin(), vecs.end()), ...);
        sort(uniqV.begin(), uniqV.end());
        uniqV.erase(unique(uniqV.begin(), uniqV.end()), uniqV.end());
        sz = uniqV.size();
    }

    vector<int> zip(const vector<T> &V) {
        vector<int> ret(V.size());
        for (int i = 0; i < (int)V.size(); i++) {
            ret[i] = encode(V[i]);
        }
        return ret;
    }

    vector<T> unzip(const vector<int> &V) {
        vector<T> ret(V.size());
        for (int i = 0; i < (int)V.size(); i++) {
            ret[i] = decode(V[i]);
        }
        return ret;
    }

    int size() { return sz; }

    int encode(T x) {
        // xが存在しない場合は挿入すべき位置を返す
        auto it = lower_bound(uniqV.begin(), uniqV.end(), x);
        return it - uniqV.begin();
    }

    T decode(int x) {
        assert(0 <= x && x < sz);
        return uniqV[x];
    }
};

class UnionFind {
public:
	UnionFind() = default;
    UnionFind(int N) : par(N), sz(N, 1) {
        iota(par.begin(), par.end(), 0);
    }
	int root(int x) {
		if (par[x] == x) return x;
		return (par[x] = root(par[x]));
	}
	bool unite(int x, int y) {
		int rx = root(x);
		int ry = root(y);
        if (rx == ry) return false;
		if (sz[rx] < sz[ry]) swap(rx, ry);
		sz[rx] += sz[ry];
		par[ry] = rx;
        return true;
	}
	bool issame(int x, int y) { return (root(x) == root(y)); }
	int size(int x) { return sz[root(x)]; }
    vector<vector<int>> groups() {
        int N = par.size();
        vector<vector<int>> G(N);
        for (int x = 0; x < N; x++) {
            G[root(x)].push_back(x);
        }
		G.erase( remove_if(G.begin(), G.end(),
            [&](const vector<int>& V) { return V.empty(); }), G.end());
        return G;
    }
private:
	vector<int> par, sz;
};

template<typename T>
struct BIT {
    int N;
    vector<T> bit[2];
    BIT(int N_, int x = 0) : N(N_ + 1) {
        bit[0].assign(N, 0); bit[1].assign(N, 0);
        if (x != 0) {
            for (int i = 0; i < N; i++) add(i, x);
        }
    }
    BIT(const vector<T> &A) : N(A.size() + 1) {
        bit[0].assign(N, 0); bit[1].assign(N, 0);
        for (int i = 0; i < (int)A.size(); i++) add(i, A[i]);
    }
    void add_sub(int p, int i, T x) {
        while (i < N) { bit[p][i] += x; i += (i & -i); }
    }
    void add(int l, int r, T x) {
        add_sub(0, l + 1, -x * l); add_sub(0, r + 1, x * r);
        add_sub(1, l + 1, x); add_sub(1, r + 1, -x);
    }
    void add(int i, T x) { add(i, i + 1, x); }
    T sum_sub(int p, int i) {
        T ret = T(0);
        while (i > 0) { ret += bit[p][i]; i -= (i & -i); }
        return ret;
    }
    T sum(int i) { return sum_sub(0, i) + sum_sub(1, i) * i; }
    T sum(int l, int r) { return sum(r) - sum(l); }
    T get(int i) { return sum(i, i + 1); }
    void set(int i, T x) { T s = get(i); add(i, -s + x); }
};

template<int mod> class Modint {
public:
    int val = 0;
    Modint(int x = 0) { while (x < 0) x += mod; val = x % mod; }
    Modint(const Modint &r) { val = r.val; }
    Modint& operator=(const Modint &r) { val = r.val; return *this; } // -Wextra対策で付け足したが正しく動くかわからん
    // Modint(const Modint &r) = default;

    Modint operator -() { return Modint(-val); } // 単項
    Modint operator +(const Modint &r) { return Modint(*this) += r; }
    Modint operator +(const int &q) { Modint r(q); return Modint(*this) += r; }
    Modint operator -(const Modint &r) { return Modint(*this) -= r; }
    Modint operator -(const int &q) { Modint r(q); return Modint(*this) -= r; }
    Modint operator *(const Modint &r) { return Modint(*this) *= r; }
    Modint operator *(const int &q) { Modint r(q); return Modint(*this) *= r; }
    Modint operator /(const Modint &r) { return Modint(*this) /= r; }
    Modint operator /(const int &q) { Modint r(q); return Modint(*this) /= r; }

    Modint& operator ++() { val++; if (val >= mod) val -= mod; return *this; } // 前置
    Modint operator ++(signed) { ++*this; return *this; } // 後置
    Modint& operator --() { val--; if (val < 0) val += mod; return *this; }
    Modint operator --(signed) { --*this; return *this; }
    Modint &operator +=(const Modint &r) { val += r.val; if (val >= mod) val -= mod; return *this; }
    Modint &operator +=(const int &q) { Modint r(q); val += r.val; if (val >= mod) val -= mod; return *this; }
    Modint &operator -=(const Modint &r) { if (val < r.val) val += mod; val -= r.val; return *this; }
    Modint &operator -=(const int &q) { Modint r(q);  if (val < r.val) val += mod; val -= r.val; return *this; }
    Modint &operator *=(const Modint &r) { val = val * r.val % mod; return *this; }
    Modint &operator *=(const int &q) { Modint r(q); val = val * r.val % mod; return *this; }
    Modint &operator /=(const Modint &r) {
        int a = r.val, b = mod, u = 1, v = 0;
        while (b) {int t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v);}
        val = val * u % mod; if (val < 0) val += mod;
        return *this;
    }
    Modint &operator /=(const int &q) {
        Modint r(q); int a = r.val, b = mod, u = 1, v = 0;
        while (b) {int t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v);}
        val = val * u % mod; if (val < 0) val += mod;
        return *this;
    }
    bool operator ==(const Modint& r) { return this -> val == r.val; }
    bool operator !=(const Modint& r) { return this -> val != r.val; }
    bool operator <(const Modint& r) { return this -> val < r.val; }
    bool operator >(const Modint& r) { return this -> val > r.val; }

    friend istream &operator >>(istream &is, Modint& x) {
        int t; is >> t; x = t; return (is);
    }
    friend ostream &operator <<(ostream &os, const Modint& x) {
        return os << x.val;
    }
};
using mint = Modint<MOD>;

mint modpow(const mint &x, int n) {
    if (n < 0) return (mint)1 / modpow(x, -n); // 未verify
    assert(n >= 0);
    if (n == 0) return 1;
    mint t = modpow(x, n / 2);
    t = t * t;
    if (n & 1) t = t * x;
    return t;
}
int modpow(__int128_t x, int n, int mod) {
    if (n == 0 && mod == 1) return 0;
    assert(n >= 0 && mod > 0); // TODO: n <= -1
    __int128_t ret = 1;
    while (n > 0) {
        if (n % 2 == 1) ret = ret * x % mod;
        x = x * x % mod;
        n /= 2;
    }
    return ret;
}
// int modinv(__int128_t x, int mod) { //
//     assert(mod > 0);
//     // assert(x > 0);
//     if (x == 1 or x == 0) return 1;
//     return mod - modinv(mod % x, mod) * (mod / x) % mod;
// }

namespace combination {
    vector<mint> _fac, _finv, _inv;
    void COMinit(int N) {
        assert(N > 0);
        _fac.resize(N + 1); _finv.resize(N + 1);  _inv.resize(N + 1);
        _fac[0] = _fac[1] = 1; _finv[0] = _finv[1] = 1; _inv[1] = 1;
        for (int i = 2; i <= N; i++) {
            _fac[i] = _fac[i-1] * mint(i);
            _inv[i] = -_inv[MOD % i] * mint(MOD / i);
            _finv[i] = _finv[i - 1] * _inv[i];
        }
    }

    mint FAC(int N) {
        if (N < 0) return 0;
        return _fac[N];
    }
    mint FACinv(int N) {
        if (N < 0) return 0;
        return _finv[N];
    }
    mint COM(int N, int K) {
        if (N < K) return 0;
        if (N < 0 or K < 0) return 0;
        return _fac[N] * _finv[K] * _finv[N - K];
    }
    mint COMinv(int N, int K) {
        if (N < K) return 0;
        if (N < 0 or K < 0) return 0;
        return _finv[N] * _fac[K] * _fac[N - K];
    }
    mint MCOM(const vector<int> &V) {
        int N = 0;
        for (int i = 0; i < (int)V.size(); i++) N += V[i];
        mint ret = _fac[N];
        for (int i = 0; i < (int)V.size(); i++) ret *= _finv[V[i]];
        return ret;
    }
    mint PERM(int N, int K) {
        if (N < K) return 0;
        if (N < 0 or K < 0) return 0;
        return _fac[N] * _finv[N - K];
    }
    mint NHK(int N, int K) { // initのサイズに注意
        if (N == 0 && K == 0) return 1;
        return COM(N + K - 1, K);
    }
} using namespace combination;

/* #endregion */

signed main() {
    int W, B;
    cin >> W >> B;
    int w = W*1000;
    for (int n = 0; n < 1e7; n++) {
        if (n*B > w) {
            cout << n << endl;
            return 0;
        }
    }
}

Submission Info

Submission Time
Task A - Balloon Trip
User T101010101
Language C++23 (GCC 15.2.0)
Score 100
Code Size 28234 Byte
Status AC
Exec Time 9 ms
Memory 6536 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 3
AC × 31
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt
Case Name Status Exec Time Memory
sample_01.txt AC 9 ms 6396 KiB
sample_02.txt AC 3 ms 6428 KiB
sample_03.txt AC 3 ms 6388 KiB
test_01.txt AC 3 ms 6416 KiB
test_02.txt AC 2 ms 6344 KiB
test_03.txt AC 2 ms 6256 KiB
test_04.txt AC 3 ms 6344 KiB
test_05.txt AC 2 ms 6224 KiB
test_06.txt AC 2 ms 6224 KiB
test_07.txt AC 2 ms 6428 KiB
test_08.txt AC 2 ms 6224 KiB
test_09.txt AC 3 ms 6440 KiB
test_10.txt AC 2 ms 6224 KiB
test_11.txt AC 2 ms 6536 KiB
test_12.txt AC 2 ms 6352 KiB
test_13.txt AC 2 ms 6416 KiB
test_14.txt AC 2 ms 6224 KiB
test_15.txt AC 2 ms 6496 KiB
test_16.txt AC 3 ms 6492 KiB
test_17.txt AC 2 ms 6396 KiB
test_18.txt AC 2 ms 6408 KiB
test_19.txt AC 2 ms 6492 KiB
test_20.txt AC 2 ms 6492 KiB
test_21.txt AC 3 ms 6372 KiB
test_22.txt AC 3 ms 6256 KiB
test_23.txt AC 3 ms 6408 KiB
test_24.txt AC 3 ms 6344 KiB
test_25.txt AC 3 ms 6480 KiB
test_26.txt AC 3 ms 6360 KiB
test_27.txt AC 3 ms 6396 KiB
test_28.txt AC 3 ms 6440 KiB