QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#754865#9622. 有限小数D12EQDWA 49ms3952kbC++172.5kb2024-11-16 15:59:342024-11-16 15:59:35

Judging History

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

  • [2024-11-16 15:59:35]
  • 评测
  • 测评结果:WA
  • 用时:49ms
  • 内存:3952kb
  • [2024-11-16 15:59:34]
  • 提交

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 = inf;

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

    int b3 = b / b2;

    for (int x : p){
        int val = a * x % b2;
        val = (b2 - val) % b2;

        int d = x * b2;
        int X,Y;

        exgcd(b3, b2, X, Y); 
        X = (X % b2 + b2) % b2;

        int c = X * val % b2;
        if (c < ansc){
            ansc = c;
            ansd = d;
        }
    }

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

/*

 4
 1 2
 2 3
 3 7
 19 79

*/

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

    int T = 1;
    cin >> T;

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

}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 49ms
memory: 3952kb

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 15
1 7
1 231680000
23 60058593750
1 2203125000
3 2086400000
1 63360
0 1
1 61000
0 1
1 59570312500
1 10750
1 18500
1 1117187500
1 331250
1 11230468750
1 31
1 15
1 289600000
1 455000
1 17968750000
1 1265625
0 1
1 1484375
0 1
1 415
1 235937500
1 765000000
1 181250
1 2968750
1 4406250
...

result:

wrong answer Integer 60058593750 violates the range [1, 10^9]