链接:http://acm.hdu.edu.cn/showproblem.php?pid=6624
题意:T组样例,给你p和x,求满足中,最小的b,且0<a<b。
思路:
推到这儿,就有一个神奇的算法,辗转相除法,具体细节我也搞不懂,不管了,记吧。具体实现和exgcd很像。
现在我们把这个问题一般化,也就是求满足不等式的x、y中,最小的x和y。
1.如果,也就是说区间内存在整数,那么,y=1,返回并加上之前减去的即可。
2.否则,,左右两边同时减去,在把分数取倒数,继续运算。
(取倒数是因为,左右两边减去之后,取倒数才能使得区间内有可能存在整数,不然左右的差
,这样还是没有整数。)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void f(ll la,ll lb,ll ra,ll rb,ll& x,ll& y)
{
ll minint=la/lb+1;
if(minint<=ra/rb)
{
x=minint;
y=1;
return ;
}
minint--;//意为floor(la/lb)
la-=minint*lb; ra-=minint*rb;
f(rb,ra,lb,la,y,x);
x+=minint*y;
return ;
}
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
ll b,y,a,p,x;
scanf("%lld%lld",&p,&x);
f(p,x,p,x-1,b,y);
a=b*x-y*p;
printf("%lld/%lld\n",a,b);
}
return 0;
}