2 条题解
-
0
pow函数实现
#include <iostream> #include <cmath> using namespace std; int main() { int l, r; cin >> l >> r; int ans = 0; for (int n = l; n <= r; n++) { bool flag = false; for (int x = 0; x <= 13; x++) { int px = (int)pow(2, x); for (int y = x; y <= 13; y++) { int py = (int)pow(2, y); if (px + py == n) { flag = true; break; // 可选:提前退出内层循环 } } if (flag) break; // 可选:提前退出 x 循环 } if (flag) ans++; } cout << ans << endl; return 0; } -
0
🎯 题目理解
一个正整数 是幂和数,当且仅当它可以表示为两个 2 的次幂之和:
$$n = 2^x + 2^y \quad (x, y \geq 0,\ x \leq y\ \text{可避免重复})$$注意: 和 可以相等(比如 )。
我们需要统计在区间 中有多少个这样的数。
✅ 解题思路
- 枚举每个
- 对每个 ,判断它是否可以写成
- 枚举 和 ,计算 是否等于
但注意:由于 ,而 ,所以 即可。
我们可以预处理所有可能的 值(最多到 ),然后枚举 ,看 是否在 范围内,并用集合或布尔数组记录哪些数是幂和数。
但这里题目给出的是一个嵌套循环结构,所以我们按照这个结构填空。
✅ 补全代码
for (int n = l; n <= r; n++) { // 枚举 l~r 的每一个数 bool flag = false; for (int x = 0; x <= 13; x++) { // 枚举 x int px = 1 << x; // 计算 2 的 x 次方 for (int y = x; y <= 13; y++) { // 枚举 y,从 x 开始避免重复 int py = 1 << y; // 计算 2 的 y 次方 if (px + py == n) // 判断是否是幂和数 flag = true; } } if (flag) ans++; // 更新答案 }
✅ 完整代码示例
#include <iostream> using namespace std; int main() { int l, r; cin >> l >> r; int ans = 0; for (int n = l; n <= r; n++) { // 枚举 l~r 的每一个数 bool flag = false; for (int x = 0; x <= 13; x++) { // 枚举 x int px = 1 << x; // 计算 2 的 x 次方 for (int y = x; y <= 13; y++) { // 枚举 y int py = 1 << y; // 计算 2 的 y 次方 if (px + py == n) // 判断是否是幂和数 flag = true; } } if (flag) ans++; // 更新答案 } cout << ans << endl; return 0; }
✅ 说明
1 << x是快速计算 的方式。y从x开始,避免重复计算如 和 ,但因为加法交换律,我们只需考虑 。- 最大需要 ,而 ,所以 足够。
✅ 样例验证
输入
2 8:幂和数有:
- 不行
所以 —— 共 6 个 ✅
✅ 最终填空答案
for (int n = l; n <= r; n++) { // 枚举 l~r 的每一个数 bool flag = false; for (int x = 0; x <= 13; x++) { // 枚举 x int px = 1 << x; // 计算 2 的 x 次方 for (int y = x; y <= 13; y++) { // 枚举 y int py = 1 << y; // 计算 2 的 y 次方 if (px + py == n) // 判断是否是幂和数 flag = true; } } if (flag) ans++; // 更新答案 }✅ 完整、正确、高效。
- 1
信息
- ID
- 484
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者
粤公网安备44195502000169号