参考资料1
参考资料2
对于二分答案为分数十分管用。
例题:HDU 6209
求
的最接近且分母
的分数。
注意这里求的是最接近,所以参考资料1的方法需要做出一些调整。
应该是
其中这个
是需要二分出来的最大的
满足
另一个方向类似。
这个方法可以保证如果当前
,那么
是不大于
的最接近,
是不小于的最接近。
时间复杂度应该是两个
的。
目前是
的
#include<bits/stdc++.h>
#define db long double
#define LL long long
using namespace std;
int main(){
int T;scanf("%d",&T);
for(int K;T--;){
scanf("%d",&K);
db x=pow((db)K,(db)2.0/(db)3);
LL lu=floor(x),ld=1,ru=ceil(x),rd=1;
for(;ld+rd<=100000;){
if(lu+ru<x*(ld+rd)){
int L=1,R=(100000-ld)/rd,m;
for(;L<R;){
m=(L+R+1)>>1;
if(lu+ru*m<x*(ld+rd*m)) L=m;
else R=m-1;
}
lu+=ru*L,ld+=rd*L;
}
else{
int L=1,R=(100000-rd)/ld,m;
for(;L<R;){
m=(L+R+1)>>1;
if(lu*m+ru>=x*(ld*m+rd)) L=m;
else R=m-1;
}
ru+=lu*L,rd+=ld*L;
}
}
if(fabs((db)1.0*lu/ld-x)>fabs((db)1.0*ru/rd-x)) swap(lu,ru),swap(ld,rd);
printf("%lld/%lld\n",lu,ld);
}
}