QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#581758#9381. 502 Bad GatewayFalse0099TL 1ms3672kbC++203.7kb2024-09-22 14:06:532024-09-22 14:06:54

Judging History

你现在查看的是最新测评结果

  • [2024-09-24 14:55:37]
  • hack成功,自动添加数据
  • (/hack/886)
  • [2024-09-22 14:06:54]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:3672kb
  • [2024-09-22 14:06:53]
  • 提交

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 <= 5; 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: 3672kb

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...

result: