题意; 求接近规定 分数 的 最大分数
用到 farey 数列的第二条性质
1 #include <iostream>
2 #include<stdio.h>
3 using namespace std;
4 /**
5 |a/b-c/d|最小, 同分的|(ad-bc)/bd| 最小,,即求
6 |ax-by| 最小
7 若a,b 有公约数则同分即可。。最小为0
8 若a,b无公约数,即a,b互质,即求ax-by=1或 -ax+by = 1
9 此时需要注意 若a==1 求解释x=1,y=0.。。所以当a=1时需要特殊处理
10 若a!=1 时,,就需要对上面的两个式子ax-by=1或 -ax+by = 1判断,找出最接近的解,即比较分母大的即可
11
12 */
13 long long ex_gcd(long long a,long long b,long long &x, long long &y){
14 if(b==0){
15 x =1;
16 y =0;
17 return a;
18 }
19 long long d = ex_gcd(b,a%b,x,y);
20 long long temp = x;
21 x = y;
22 y = temp - a/b * y;
23 return d ;
24 }
25
26
27 int main()
28 {
29 int t;
30 cin>>t;
31 long long a,b,x,y,gcd,d1,d2,c1,c2;
32 char c;
33 while(t--){
34 cin>>a>>c>>b;
35 gcd = ex_gcd(a,b,x,y);
36 if(gcd!=1){
37 cout<<a/gcd<<"/"<<b/gcd<<endl;
38 }else if(a==1){
39 cout<<1<<"/"<<b-1<<endl;
40 }else{
41 // d2 = ex_gcd(b,a,y2,x2);
42 d1 = (x+b)%b;
43 d2 = (-x+b)%b;
44 c1 = (-y+a)%a;
45 c2 = (y+a)%a;
46 // cout<<c1<<" "<<c2<<endl;
47 // cout<<d1<<" "<<d2<<endl;
48 if(d1>d2)
49 cout<<c1<<"/"<<d1<<endl;
50 else
51 cout<<c2<<"/"<<d2<<endl;
52
53
54 }
55 }
56 return 0;
57 }