1 条题解

  • 0
    @ 2025-8-24 23:04:57

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Little_x_starTYJ
    愿时光能缓,愿故人不散! || 众所周知,如果把灯泡放在嘴里,即使你自己一个人也取得出来灯泡。

    搬运于2025-08-24 23:04:57,当前版本为作者最后更新于2024-10-11 15:15:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    通俗题意

    给你三个整数 a,b,ka, b, k,需要你求出满足下列条件的不同的 x,yx, y 有多少对。

    • ax2,y3ba\leq x^2, y^3 \leq b
    • x2y3k|x^2 - y^3| \leq k
    • x,yx, y 均为非负整数。

    解题思路

    注意到题目中一直在算平方和立方,所以可以猜测正确的时间复杂度应该是带有根号的。又观察到 1ab10181\leq a \leq b \leq 10^{18},所以排除 O(n)\mathcal{O}(\sqrt{n}) 的算法,那么还有一种可能的时间复杂度就是 O(n3)\mathcal{O}(\sqrt[3]{n})

    首先 x,yx, y 一定是在区间 $[\lceil\sqrt[3]{a}\rceil, \lfloor\sqrt[3]{b}\rfloor]$ 之间的。为什么要加上向上取整与向下取整呢?因为 x,yx, y 为整数,那么当 y=a3y = \lfloor\sqrt[3]{a}\rfloor 时,y3ay^3 \leq a,很明显在 aa 不是完全立方数时满足 y3<ay^3 < a,例如 a=3a = 3 时,y=33=1y = \lfloor\sqrt[3]{3}\rfloor = 1,而 y3=1<ay^3 = 1 < a

    接着我们考虑在区间 $[\lceil\sqrt[3]{a}\rceil, \lfloor\sqrt[3]{b}\rfloor]$ 之间枚举 yy。这时 x2y3k|x^2 - y^3| \leq k 就可以看成 x2x^2 只能在 [y3k,y3+k][y^3 - k, y^3 + k] 中。那么当 y3k0y^3 - k \geq 0 时,xx 的最小取值为 y3k\sqrt{y^3 - k},当 y3k<0y^3 - k < 0 时,我们让 x=0x = 0

    所以,xx 所在的区间也就是 [max{0,y3k},y3+k][\sqrt{\max\{0, y^3 - k\}}, \sqrt{y^3 + k}]。但是题目要求 ax2ba\leq x^2 \leq b,所以最终 xx 的取值范围就是 $[\sqrt{\max\{y^3 - k, a\}}, \sqrt{\min\{y^3 + k, b\}}]$。我们都知道 lrl\sim r 之间的整数的个数为 rl+1r - l + 1,那么我们就可以解出这道题了。

    算法总时间复杂度 O(ba3)\mathcal{O}(\sqrt[3]{b - a})

    CODE:

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    signed main() {
    	ios::sync_with_stdio(false);
    	ios_base::sync_with_stdio(false);
    	cin.tie(0), cout.tie(0);
    	int a, b, k, ans = 0;
    	cin >> a >> b >> k;
    	int l = ceil(cbrt(a)), r = cbrt(b);
    	for (int y = l; y <= r; y++) {
    		ans += floor(sqrt(min(y * y * y + k, b))) - ceil(sqrt(max(y * y * y - k, a))) + 1;
    	}
    	cout << ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    10866
    时间
    200ms
    内存
    500MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者