QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#754647#9622. 有限小数D12EQDWA 268ms4012kbC++172.5kb2024-11-16 15:28:592024-11-16 15:28:59

Judging History

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

  • [2024-11-16 15:28:59]
  • 评测
  • 测评结果:WA
  • 用时:268ms
  • 内存:4012kb
  • [2024-11-16 15:28:59]
  • 提交

answer

#include <bits/stdc++.h>
#define min(a,b) (a > b ? b : a)
#define max(a,b) (a < b ? b : a)

#define YES (cout << "YES" << endl)
#define NO (cout << "NO" << endl)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define rrep(a, b, c) for (a = b; a >= c; a--)
#define rep(a, b, c) for (a = b; a <= c; a++)
#define int long long
#define IOS ios::sync_with_stdio(0); cout.tie(0);

using namespace std;

typedef double db;
typedef pair<int,int> pii;
typedef array <int,3> a3;

const db eps = 1e-7;
const int inf = 2e10;
const int N = 200010;

// ax + by = gcd(a, b) 的解
int exgcd(int a,int b,int &x,int &y){
    if (b==0){
        x = 1;
        y = 0;
        return a;
    }

    int x1, y1, res;
    res = exgcd(b, a % b, x1, y1);
    x = y1 , y = x1 - a/b *y1;
    return res;
}

// 解 ax + by = c 的解 其中 x 是负数 
pii solve(int a, int b, int c) { 
    // cout << "SOLVE : " << a << ' ' << b << " " << c << endl;  
    int gcd = __gcd(a, b); 
    
    if (c % gcd != 0){
        return {-inf, -inf}; 
    }
    
    int x = 0, y = 0; 
    int cnt = c / gcd; 
    
    exgcd(a, b, x, y); 
    
    x *= cnt; y *= cnt; 

    int l = -inf, r = inf;
    while (l + 1 != r){
        int mid = l + r >> 1;
        int nowx = x + (b / gcd) * mid;

        if (nowx <= 0){
            l = mid;
        }else{
            r = mid;
        }
    }

    x = x + (b / gcd) * l;
    y = y - (a / gcd) * l;

    return {x, y}; 
}

vector <int> p;

void init(){
    int i, j;

    rep(i,0,32){
        rep(j,0,32){
            int val = pow(2, i) * pow(5, j);
            if (val > 1e9) break;
            p.push_back(val);
        }
    }
}

void solve(){
    int a, b;
    cin >> a >> b;

    int ansc = inf;
    int ansd = 0;

    int z = b;
    while (z % 2 == 0) z /= 2;
    while (z % 5 == 0) z /= 5;
    b = z;

    for (int y : p){
        int d = b * y;
        int k = b * b;

        auto [c, x] = solve(b, k, a * d);

        if (c != -inf){
            c = -c;

            int g = __gcd(c, d);
            c /= g;
            d /= g;

            if (ansc > c && d <= 1e9){
                ansc = c;
                ansd = d;
            }
        }
    }


    cout << ansc << ' ' << ansd << endl;
}

/*


*/

signed main(){
    cin.tie(0);
    init();
    IOS;

    int T = 1;
    cin >> T;

    while (T --){
        solve();
    }

    // system("pause");
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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
Wrong Answer
time: 268ms
memory: 4012kb

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 3
1 828125000
1 3
1 21875
1 231680000
23 960937500
1 36096000
5 326
1 63360
0 1
1 61000
0 1
1 4880
1 5375
1 9250
1 11714560
1 331250
1 898437500
1 31
1 3
1 289600000
1 455000
1 115000000
1 1265625
0 1
1 14843750
0 1
1 415
1 235937500
1 765000000
1 90625
1 2968750
1 4406250
3 6200
1 15
3 347500
1 9...

result:

wrong answer The result is not terminating.(Testcase 3)