QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#740565#9622. 有限小数susanzhishenWA 92ms3880kbC++142.3kb2024-11-13 10:32:232024-11-13 10:32:28

Judging History

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

  • [2024-11-13 10:32:28]
  • 评测
  • 测评结果:WA
  • 用时:92ms
  • 内存:3880kb
  • [2024-11-13 10:32:23]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define double long double
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef long long ll;
typedef pair<int,int> PII;
const int N=3e5+10;
const int M=1e3+10;
int mod=998244353;
vector<int>sp;
//exgcd可以求出不定方程 ax+by=c的一组特解
//原方程有解的条件是c%gcd(a,b)==0;
//即求 ax+by=gcd(a,b) 的一组特解,然后将x和y乘以 c/gcd(a,b) 即可
//1.当b等于0时,x=1,y=0即可
//2.当b!=0时,根据递归的x1,y1反解出上一层的x和y
//x=y1,y=(x1-a/b*y1),回溯的时候用.
//通解为 x=x1+s*dx,t=y1-s*dy; 其中dx=b/gcd(a,b),dy=a/gcd(a,b);
int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}
void Exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return ;
    }
    int p;
    Exgcd(b,a%b,x,y);
    p=x;
    x=y;
    y=p-a/b*y;
    return ;
}
int check(int x){
    if(x%5==0||x%2==0) return 1;
    return 0;
}
void solve(){
    int a,b;cin>>a>>b;
    int pp=1;
    for(int i=1;i*i<=b;i++){
        if(b%i==0){
            if(!check(i)) pp=max(pp,i);
            if(!check(b/i)) pp=max(pp,b/i);
        }
    }
    int ansc=1e18;
    int ansd=1e18;
    for(auto u:sp){
        if(u*pp*b>1e10) break;
        int d=u*pp;
        int aa=pp*pp;
        int bb=-b;
        int cc=a*d;
        if(cc%__gcd(aa,bb)!=0) continue;
        int x0=0,y0=0;
        Exgcd(aa,bb,x0,y0);
        int g=cc/__gcd(aa,bb);
        int dx=bb/__gcd(aa,bb),dy=aa/__gcd(aa,bb);
        x0*=g,y0*=g;
        if(u*pp*b==98){
            // cout<<x0<<" "<<y0<<" "<<dx<<" "<<dy<<"\n";

        }
        int s;
        if(dy<0) s=(y0+dy-1)/dy;
        else s=(y0-dy+1)/dy;
        y0-=s*dy;
        if(x0+s*dx>0){
            int cp=__gcd(y0,d);
            if(y0/cp<ansc) ansc=y0/cp,ansd=d/cp;
        }
    }
    cout<<ansc<<" "<<ansd<<"\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int _;
    for(int i=0;(int)powl(2,i)<=1000000000;i++){
        int x=(int)pow(2,i);
        for(int j=0;(int)powl(5,j)*x<=1000000000;j++){
            sp.push_back((int)powl(5,j)*x);
        }
    }
    sort(sp.begin(),sp.end());
    _=1;
    cin>>_;
    while(_--){
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 92ms
memory: 3880kb

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 54272
1 6
1 7
7 90500
23 3936
5 282
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
7 113125
1 455000
1 58880
1 51840
0 1
1 304
0 1
1 415
1 19328000
5 156672
1 4640
1 608
1 72192
3 775
1 3
3 347500
1 944
1 43600
1 76
1 430000
1 6336
1 29184
11 795000
0 ...

result:

wrong answer Jury found better answer than participant's 1 < 7 (Testcase 5)