UVA - 10976 Fractions Again?! 【枚举技巧】 水题!

传送门

题意: 找到所有的正整数 x >= y, 使得1/k = 1/x + 1/y;

思路: 因为 x >= y, 有1/x <= 1/y, 因此1/k - 1/y <= 1/y, 即y <= 2*k, 所以我们枚举y的范围在2k之内即可, 然后计算x, 检验是否合法即可. 复杂度O(k), 其实进一布推到知枚举范围在 k + 1 ~ 2*k 之间……

AC Code

const int maxn = 1e3 + 5;
pii a[maxn];
int cal(int k) {
    int cc = 0;
    for (int i = k+1 ; i <= 2*k ; i ++) {
        if (k*i % (i-k) == 0) {
            a[++cc] = {i, k*i/(i-k)};
        }
    }
    return cc;
}
void solve() {
    int n;
    while(~scanf("%d", &n)) {
        int k = cal(n);
        printf("%d\n", k);
        for (int i = 1 ; i <= k ; i ++) {
            int x = min(a[i].fi, a[i].se);
            int y = max(a[i].fi, a[i].se);
            printf("1/%d = 1/%d + 1/%d\n", n, y, x);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Anxdada/article/details/81487406
今日推荐