QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#581763 | #9381. 502 Bad Gateway | False0099 | TL | 1ms | 3584kb | C++23 | 3.7kb | 2024-09-22 14:07:44 | 2024-09-22 14:07:44 |
Judging History
answer
#include <bits/stdc++.h>
#define int __int128
#define endl '\n'
int INF = 0x3f3f3f3f3f3f3f3f;
using namespace std;
typedef pair<int, int> PII;
void init() {
// 初始化代码
}
template<class T>
struct Frac {
T num;
T den;
Frac(T num_, T den_) : num(num_), den(den_) {
if (den < 0) {
den = -den;
num = -num;
}
}
void Norm() {
T g = __gcd(num, den);
num /= g, den /= g;
}
Frac() : Frac(0, 1) {}
Frac(T num_) : Frac(num_, 1) {}
explicit operator double() const {
return 1. * num / den;
}
Frac& operator+=(const Frac& rhs) {
num = num * rhs.den + rhs.num * den;
den *= rhs.den;
Norm();
return *this;
}
Frac& operator-=(const Frac& rhs) {
num = num * rhs.den - rhs.num * den;
den *= rhs.den;
Norm();
return *this;
}
Frac& operator*=(const Frac& rhs) {
num *= rhs.num;
den *= rhs.den;
Norm();
return *this;
}
Frac& operator/=(const Frac& rhs) {
num *= rhs.den;
den *= rhs.num;
Norm();
if (den < 0) {
num = -num;
den = -den;
}
return *this;
}
friend Frac operator+(Frac lhs, const Frac& rhs) {
return lhs += rhs;
}
friend Frac operator-(Frac lhs, const Frac& rhs) {
return lhs -= rhs;
}
friend Frac operator*(Frac lhs, const Frac& rhs) {
return lhs *= rhs;
}
friend Frac operator/(Frac lhs, const Frac& rhs) {
return lhs /= rhs;
}
friend Frac operator-(const Frac& a) {
return Frac(-a.num, a.den);
}
friend bool operator==(const Frac& lhs, const Frac& rhs) {
return lhs.num * rhs.den == rhs.num * lhs.den;
}
friend bool operator!=(const Frac& lhs, const Frac& rhs) {
return lhs.num * rhs.den != rhs.num * lhs.den;
}
friend bool operator<(const Frac& lhs, const Frac& rhs) {
return lhs.num * rhs.den < rhs.num * lhs.den;
}
friend bool operator>(const Frac& lhs, const Frac& rhs) {
return lhs.num * rhs.den > rhs.num * lhs.den;
}
friend bool operator<=(const Frac& lhs, const Frac& rhs) {
return lhs.num * rhs.den <= rhs.num * lhs.den;
}
friend bool operator>=(const Frac& lhs, const Frac& rhs) {
return lhs.num * rhs.den >= rhs.num * lhs.den;
}
friend std::ostream& operator<<(std::ostream& os, Frac x) {
T g = __gcd(x.num, x.den);
if (x.den < 0) {
x.den = -x.den;
x.num = -x.num;
}
return os << (long long)(x.num / g)<<" "<<(long long)(x.den/g);
}
};
void solve() {
long long _;
cin >> _;
Frac<int> n(_);
// 计算 sqrt(2 * n) 并转换为 Frac<int> 类型
double sqrt_val = sqrt(2.0 * double(n));
int sqrt_val_i=(int)(floor(sqrt_val));
Frac<int> t(sqrt_val_i, 1);
Frac<int> ans(INF, 1);
auto calc = [&](Frac<int> mid) {
return mid / 2 + n / mid-Frac<int>(1,2);
};
for (int dx = 0; dx <= 1; dx++) {
Frac<int> candidate = t + Frac<int>(dx);
//cerr<<candidate<<" "<<calc(candidate)<<endl;
if (candidate >= 1 ) {
ans = min(ans, calc(candidate));
}
candidate = t - Frac<int>(dx);
cerr<<candidate<<" "<<calc(candidate)<<endl;
if (candidate >= 1) {
ans = min(ans, calc(candidate));
}
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0);
long long t;
t = 1;
cin >> t;
init();
while (t--) {
solve();
}
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3584kb
input:
3 1 2 3
output:
1 1 3 2 2 1
result:
ok 3 lines
Test #2:
score: -100
Time Limit Exceeded
input:
1000000 1 1000000000 1 1 1000000000 1 1000000000 1 1 1 1000000000 1 1 1000000000 1 1000000000 1000000000 1 1000000000 1 1 1000000000 1 1000000000 1000000000 1 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1 1 1000000000 1 1000000000 1000000000 1000000000 1000000000 1 1 1 10000000...
output:
1 1 1999961560 44721 1 1 1 1 1999961560 44721 1 1 1999961560 44721 1 1 1 1 1 1 1999961560 44721 1 1 1 1 1999961560 44721 1 1 1999961560 44721 1999961560 44721 1 1 1999961560 44721 1 1 1 1 1999961560 44721 1 1 1999961560 44721 1999961560 44721 1 1 1999961560 44721 1999961560 44721 1999961560 44721 19...