QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#796116#9804. Guess the PolygonrgnerdplayerTL 0ms0kbC++234.2kb2024-12-01 12:12:362024-12-01 12:12:37

Judging History

This is the latest submission verdict.

  • [2024-12-01 12:12:37]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 0kb
  • [2024-12-01 12:12:36]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;

using i64 = long long;

template <int P>
struct ModInt {
    int v;

    constexpr ModInt() : v(0) {}
    constexpr ModInt(i64 v_) : v(v_ % P) {
        if (v < 0) {
            v += P;
        }
    }
    constexpr explicit operator int() const { return v; }
    constexpr friend ostream& operator<<(ostream &out, ModInt n) {
        return out << int(n);
    }
    constexpr friend istream& operator>>(istream &in, ModInt &n) {
        i64 v;
        in >> v;
        n = ModInt(v);
        return in;
    }

    constexpr friend bool operator==(ModInt a, ModInt b) {
        return a.v == b.v;
    }
    constexpr friend bool operator!=(ModInt a, ModInt b) {
        return a.v != b.v;
    }

    constexpr ModInt operator-() {
        ModInt res;
        res.v = v ? P - v : 0;
        return res;
    }

    constexpr ModInt& operator++() {
        v++;
        if (v == P) v = 0;
        return *this;
    }
    constexpr ModInt& operator--() {
        if (v == 0) v = P;
        v--;
        return *this;
    }
    constexpr ModInt& operator+=(ModInt o) {
        v -= P - o.v;
        v = (v < 0) ? v + P : v;
        return *this;
    }
    constexpr ModInt& operator-=(ModInt o) {
        v -= o.v;
        v = (v < 0) ? v + P : v;
        return *this;
    }
    constexpr ModInt& operator*=(ModInt o) {
        v = 1LL * v * o.v % P;
        return *this;
    }
    constexpr ModInt& operator/=(ModInt o) { return *this *= o.inv(); }

    constexpr friend ModInt operator++(ModInt &a, int) {
        ModInt r = a;
        ++a;
        return r;
    }
    constexpr friend ModInt operator--(ModInt &a, int) {
        ModInt r = a;
        --a;
        return r;
    }

    constexpr friend ModInt operator+(ModInt a, ModInt b) {
        return ModInt(a) += b;
    }
    constexpr friend ModInt operator-(ModInt a, ModInt b) {
        return ModInt(a) -= b;
    }
    constexpr friend ModInt operator*(ModInt a, ModInt b) {
        return ModInt(a) *= b;
    }
    constexpr friend ModInt operator/(ModInt a, ModInt b) {
        return ModInt(a) /= b;
    }

    constexpr ModInt qpow(i64 p) {
        ModInt res = 1, x = v;
        while (p > 0) {
            if (p & 1) { res *= x; }
            x *= x;
            p >>= 1;
        }
        return res;
    }
    constexpr ModInt inv() {
        return qpow(P - 2);
    }
};

constexpr int P = 998244353;
using Mint = ModInt<P>;

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    auto read = [&]() {
        string s;
        cin >> s;
        Mint res = 0;
        for (auto ch : s) {
            res = res * 10 + ch - '0';
        }
        return res;
    };

    auto query = [&](int p, int q) {
        assert(p >= 0 && q >= 0);
        int g = gcd(p, q);
        p /= g, q /= g;
        cout << "? " << p << ' ' << q << endl;
        auto num = read(), den = read();
        return num / den;
    };

    int t;
    cin >> t;

    auto solve = [&]() {
        int n;
        cin >> n;

        vector<int> x(n);
        for (int i = 0; i < n; i++) {
            int y;
            cin >> x[i] >> y;
        }

        sort(x.begin(), x.end());
        x.erase(unique(x.begin(), x.end()), x.end());
        Mint ans = 0;

        if (x.size() == n) {
            int lstx = x[0];
            Mint lstlen = 0;
            for (int i = 1; i < n - 1; i++) {
                auto curlen = query(x[i], 1);
                ans += (lstlen + curlen) * (x[i] - lstx) / 2;
                lstx = x[i];
                lstlen = curlen;
            }
            ans += (x[n - 1] - lstx) * lstlen / 2;
        } else {
            Mint lstlen = 0;
            for (int i = 1; i < x.size(); i++) {
                auto curlen = query(x[i] + x[i - 1], 2);
                ans += curlen * (x[i] - x[i - 1]);
                lstlen = curlen + curlen - lstlen;
            }
        }

        if (int(ans) <= P / 4) {
            cout << "! " << ans << ' ' << 1 << '\n';
        } else {
            cout << "! " << ans * 2 << ' ' << 2 << '\n';
        }
    };
    
    while (t--) {
        solve();
    }
    
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Time Limit Exceeded

input:

2
4
3 0
1 3
1 1
0 0
1 1
1 1

output:

? 1 2
? 2 1

result: