[HDU 6209] The Intersection

来源:互联网 发布:查看linux系统版本命令 编辑:程序博客网 时间:2024/06/07 18:27

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6209

题目大意:T组数据, 输入一个整数k,求最接近k23的分母不超过105的有理数。(T,k105)

思路:设x=k23, 若x落在[ab,cd]内, 考虑新的分界点a+cb+d, 每次都用新的边界更新答案, 直到b+d>105。 初始区间可以认为是[x,x+1]

PS: 这个题要到处用long double

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#define ld long doubleusing namespace std;const int lim = (int)1e5;int T, k;int gcd(int a, int b){    if (b == 0) return a;    return gcd(b, a % b);}void simplify(int &a, int &b){    int g = gcd(a, b);    a /= g, b /= g;}int main(){    scanf("%d", &T);    while (T --){        scanf("%d", &k);        ld x = pow((ld)k, (ld)2.0 / 3);        int a = (int)floor(x);        int b = 1, c = a + 1, d = 1;        if (1LL * a * a * a == 1LL * k * k){            printf("%d/1\n", a); continue;        }        int u, v;        if (fabs((ld)a - x) < fabs((ld)c - x)) u = a, v = 1;        else u = c, v = 1;        while(1){            int i = a + c, j = b + d;            simplify(i, j);            if (j > lim) break;            if (fabs((ld)1.0 * i / j - x) < fabs((ld)1.0 * u / v - x))                u = i, v = j;                if ((ld)1.0 * i / j < x) a = i, b = j;            else c = i, d = j;        }        printf("%d/%d\n", u, v);    }       return 0;}