QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#754897#9622. 有限小数app1eDogTL 0ms3592kbC++202.7kb2024-11-16 16:03:332024-11-16 16:03:34

Judging History

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

  • [2024-11-16 16:03:34]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3592kb
  • [2024-11-16 16:03:33]
  • 提交

answer

// created on Lucian Xu's Laptop

#include <bits/stdc++.h>

// using namespace std;

#define typet typename T
#define typeu typename U
#define types typename... Ts
#define tempt template <typet>
#define tempu template <typeu>
#define temps template <types>
#define tandu template <typet, typeu>

using UI = unsigned int;
using ULL = unsigned long long;
using LL = long long;
using ULL = unsigned long long;
using i128 = __int128;
using PII = std::pair<int, int>;
using PIL = std::pair<int, LL>;
using PLI = std::pair<LL, int>;
using PLL = std::pair<LL, LL>;
using vi = std::vector<int>;
using vvi = std::vector<vi>;
using vl = std::vector<LL>;
using vvl = std::vector<vl>;
using vpi = std::vector<PII>;

#define ff first
#define ss second
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) \
    do {           \
    } while (false)
#endif

constexpr int mod = 998244353;
constexpr int inv2 = (mod + 1) / 2;
constexpr int inf = 0x3f3f3f3f;
constexpr LL INF = 1e18;
constexpr double pi = 3.141592653589793;
constexpr double eps = 1e-6;

constexpr int lowbit(int x) { return x & -x; }
tandu bool Max(T& x, const U& y) { return x < y ? x = y, true : false; }
tandu bool Min(T& x, const U& y) { return x > y ? x = y, true : false; }

void solut() {
    auto exgcd = [&](auto&& self, LL a, LL b, LL& x, LL& y) {
        if (!b) {
            x = 1, y = 0;
            return a;
        }
        LL d = self(self, b, a % b, y, x);
        y -= a / b * x;
        return d;
    };
    auto find = [&](LL a, LL b, LL d, LL m) {
        b /= m, d /= m;
        LL x, y;
        LL g = exgcd(exgcd, m, b, x, y);
        if ((a * d) % g) return -1ll;
        m /= g, b /= g;
        x *= a * d, y *= a * d;
        // debug(m * x + b * y, a * b);
        LL t = (abs(y) + m - 1) / m;
        y -= m * t;
        while (y > 0) y -= m;
        return -y;
    };
    LL a, b;
    std::cin >> a >> b;
    LL m = b;
    while (m % 2 == 0) m /= 2;
    while (m % 5 == 0) m /= 5;
    LL ans_c = INF, ans_d;
    for (LL i = 1; i <= 1e9; i *= 2) {
        for (LL j = 1; j <= 1e9 and i * j <= 1e9; j *= 5) {
            if (i * j * m > 1e9) continue;
            LL d = i * j * m;
            LL c = find(a, b, d, m);
            if (c == -1) continue;
            LL g = std::gcd(c, d);
            c /= g, d /= g;
            if (Min(ans_c, c)) ans_d = d;
        }
    }
    std::cout << ans_c << ' ' << ans_d << '\n';
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    std::cin >> t;
    while (t--) {
        solut();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3592kb

input:

4
1 2
2 3
3 7
19 79

output:

0 1
1 3
1 4375
3 316

result:

ok 4 case(s)

Test #2:

score: -100
Time Limit Exceeded

input:

10000
11 12
28 53
17 60
2 35
17 181
80 123
68 141
79 163
71 99
13 64
33 61
15 32
16 61
11 86
33 74
128 143
40 53
7 23
30 31
5 6
86 181
73 91
13 23
71 81
1 2
7 38
117 160
33 83
129 151
88 153
25 58
16 19
19 141
95 124
43 96
71 139
11 59
106 109
93 152
34 43
17 99
1 57
20 159
16 25
5 73
159 170
172 17...

output:


result: