2354. 八进制镜像坚果

1000ms 256MB 简单 字符串
题目描述
松鼠哈利需要挑选出一批魔力值在 $1 \sim N$ 之间的特殊坚果。这些坚果的魔力值(十进制正整数)必须同时满足以下两个要求: 1. 该数转换为**八进制**后是一个**回文数**(反向排列与原来一样的数,如八进制的 $11$、$121$ 等)。 2. 该数本身是一个**平方数**(可以写成某个整数的平方,如 $9 = 3^2$)。 请你帮助哈利从小到大输出所有满足要求的数。
输入格式
一行,输入一个十进制正整数 $N$ ($1 \le N \le 10^9$)。
输出格式
输出一行,包含若干个满足要求的十进制正整数,从小到大输出,正整数之间用一个空格隔开。
样例 1
输入 (Input)
20
输出 (Output)
1 4 9
样例说明
- **样例说明**: 在 $1 \sim 20$ 之间满足要求的数有: - 1:转换为八进制为 1(回文数),且 $1 = 1^2$(平方数)。 - 4:转换为八进制为 4(回文数),且 $4 = 2^2$(平方数)。 - 9:转换为八进制为 11(回文数),且 $9 = 3^2$(平方数)。 因此输出 `1 4 9`。
- 对于所有数据:$1 \le N \le 10^9$。 - **算法提示与优化**: 由于 $N$ 的范围高达 $10^9$,如果从 1 到 $N$ 逐个遍历每个数字并判断,时间复杂度为 $O(N)$,必然会导致运行超时(TLE)。 我们可以**换个角度思考**:因为符合要求的数 $X$ 必须是平方数,我们可以直接枚举平方根 $i$。 - 令 $X = i^2$,由于 $X \le N$,所以 $i$ 的取值范围是 $1 \le i \le \sqrt{N}$。 - 当 $N = 10^9$ 时,$\sqrt{N} \approx 31622$,我们只需要循环最多 $31622$ 次。 - 在循环中,计算出 $X = i^2$,然后将其转换为八进制并判断是否为回文数即可。这样整体时间复杂度可以优化至 $O(\sqrt{N} \log_8 N)$,能在 1 毫秒内计算出结果。
自测终端 stdin → stdout
输入 stdin
CtrlShiftEnter
输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字