QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#737380#9622. 有限小数_slbWA 96ms3716kbC++173.5kb2024-11-12 15:40:272024-11-12 15:40:30

Judging History

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

  • [2024-11-12 15:40:30]
  • 评测
  • 测评结果:WA
  • 用时:96ms
  • 内存:3716kb
  • [2024-11-12 15:40:27]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using i128 = __int128_t;

#define ff first 
#define ss second 
#define all(x) x.begin(),x.end()

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

const int maxn = 1e5 + 10;
const int lim = 1e9;

int tot, all[maxn];

void init()
{
    for (int i = 0; i <= 32; i++)
    {
        ll now = 1;
        for (int j = 0; j < i; j++)
            now = now * 2;
        for (int j = 0; now <= lim; j++)
        {
            all[++tot] = now;
            now = now * 5;
        }
    }
    sort(all + 1, all + tot + 1);
}

inline ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }

void exgcd(ll a, ll b, ll &x, ll &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return;
    }
    exgcd(b, a % b, y, x);
    y -= a / b * x;
}

ll inv(ll x, ll p)
{
    ll u, v;
    exgcd(x, p, u, v);
    u %= p, u += p, u %= p;
    return u;
}

bool check2(ll x)
{
    while (x % 2 == 0)
        x /= 2;
    while (x % 5 == 0)
        x /= 5;
    return x == 1;
}

bool check(ll a, ll b, ll c, ll d)
{
    ll x = a * d + b * c;
    ll y = b * d;
    ll dd = gcd(x, y);
    x /= dd, y /= dd;
    bool res = check2(y);
    // if (res == 0)
        // cerr << "?" << a << " " << b << " " << c << " " << d << endl;
    return res;
}

pair<ll, ll> get(int x, int y)
{
    if (x == 0)
        return {0, 1};
    ll d = gcd(x, y);
    x /= d, y /= d;
    return make_pair(x, y);
}

void work() {
    ll a, b;
    cin >> a >> b;
    ll dd = gcd(a, b);
    a /= dd, b /= dd;
    ll u = 1;
    while (b % 2 == 0)
        b /= 2, u *= 2;
    while (b % 5 == 0)
        b /= 5, u *= 5;
    pair<ll, ll> ans;
    ans = {lim + 1, lim + 1};
    pair<ll, ll> ans2;
    ans2 = {lim + 1, lim + 1};
    // cerr << "!!" << inv(u, b) << endl;
    for (int i = 1; i <= tot && all[i] * u * b <= lim; i++)
    {
        ll c = (b - all[i] % b * a % b) % b;
        ans = min(ans, get(c, all[i] * u * b));
        ll c2 = (b - all[i] % b * a % b) % b * inv(u, b) % b;
        ans2 = min(ans2, get(c2, all[i] * b));
    }
    for (int i = 1; i <= tot && all[i] * b <= lim; i++)
    {
        ll c2 = (b - all[i] % b * a % b) % b * inv(u, b) % b;
        ans2 = min(ans2, get(c2, all[i] * b));
    }
    // ll d = gcd(ans.first, ans.second);
    // if (ans.first != 0)
    // {
        // ll d = gcd(ans.first, ans.second);
        // if (d != 1)
            // cerr << a << " " << b << endl;
        // assert(d == 1);
        // ans.first /= d, ans.second /= d;
    // }
    // if (ans.first == 0)
    //     ans.second = 1;
    // if (ans2.first != 0)
    // {
    //     ll d = gcd(ans2.first, ans2.second);
    //     if (d != 1)
    //         cerr << a << " " << b << endl;
    //     assert(d == 1);
    //     ans2.first /= d, ans2.second /= d;
    // }
    // if (ans2.first == 0)
    //     ans2.second = 1;
    // assert(ans2.first >= 0 && ans2.first <= lim);
    // assert(ans2.second >= 1 && ans2.second <= lim);
    // assert(ans.first >= ans2.first);
    // cerr << ans.first << " " << ans.second << endl;
    // assert(check(a, b * u, ans.first, ans.second));
    // assert(check(a, b * u, ans2.first, ans2.second));
    // ans = min(ans, ans2);
    cout << ans.first << " " << ans.second << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    init();
    cin >> T;
    while (T--) work();
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3712kb

input:

4
1 2
2 3
3 7
19 79

output:

0 1
1 3
1 14
3 316

result:

ok 4 case(s)

Test #2:

score: -100
Wrong Answer
time: 96ms
memory: 3716kb

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:

1 12
1 54272
1 60
1 7
1 231680000
23 3936
1 36096000
5 326
1 63360
0 1
1 31232
0 1
1 4880
1 10750
1 18500
1 11714560
1 331250
1 2944
1 31
1 6
1 289600000
1 455000
1 58880
1 51840
0 1
1 304
0 1
1 415
1 19328000
1 765000000
1 4640
1 608
1 72192
3 775
1 48
3 347500
1 944
1 43600
1 76
1 430000
1 6336
1 ...

result:

wrong answer Jury found better answer than participant's 1 < 2 (Testcase 8812)