RealPhobia
#include<stdio.h> __int64 extgcd(__int64 a,__int64 b,__int64 &x,__int64 &y) { if(b==0) {x=1;y=0;return a;} __int64 d=extgcd(b,a%b,x,y); __int64 t=x;x=y;y=t-a/b*y; return d; } __int64 gcd(__int64 a,__int64 b) { return b>0?gcd(b,a%b):a; } int main() { __int64 t,a,b,x,y,s,x1,y1; char c; scanf("%I64d",&t); while(t--) { scanf("%I64d%c%I64d",&a,&c,&b); s=gcd(a,b); if(s>1) printf("%I64d%c%I64d\n",a/s,c,b/s); else { extgcd(a,b,x,y); while(x<0){x+=b;y-=a;} x1=x;y1=y; while(x1>0) {x1-=b;y1+=a;} if(x<0) x=-x;if(y<0) y=-y; if(x1<0) x1=-x1;if(y1<0) y1=-y1; if(y1==0){ printf("%I64d%c%I64d\n",y,c,x);continue;} if(y==0){ printf("%I64d%c%I64d\n",y1,c,x1);continue;} if(x>x1){ printf("%I64d%c%I64d\n",y,c,x);continue;} if(x<x1){ printf("%I64d%c%I64d\n",y1,c,x1);continue;} if(y1>y){ printf("%I64d%c%I64d\n",y,c,x);continue;} { printf("%I64d%c%I64d\n",y1,c,x1);continue;} } } return 0; }
/* 题意:已要求找出 一个C/D使得|A/B - C/D|最小,且0<C<D<B,0<A<B。 A,B,C,D 都是整数。
如果GCD(A,B)>1,那么C=A/GCD(A,B),D=B/GCD(A,B),可使|A/B - C/D|=0; 如果 GCD(A,B)=1;上式可化简成|(A*D-B*C)/(B*D)|由于A,B固定所以我们要是D越大,分子越小。 我假设|(A*D-B*C)|=1来做的。(至于为什么是这样子,我只能说感觉是···) 上式我们可以用扩展欧几里德来弄,得出特解,求出通解。 然后把D在范围(0,B)的最大的解输出即可。 因为我们求出的C/D一定是个真分数所以只要D<B,那么一定C<D。 */