QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#796116 | #9804. Guess the Polygon | rgnerdplayer | TL | 0ms | 0kb | C++23 | 4.2kb | 2024-12-01 12:12:36 | 2024-12-01 12:12:37 |
Judging History
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;
}
詳細信息
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