题目解析
* 输入输出:输入两个正整数 l,rl, rl,r(表示区间左右端点);输出一个整数,表示区间 [l,r][l, r][l,r] 内可以表示为两个 222 的次幂之和(n=2x+2yn = 2^x + 2^yn=2x+2y,其中 x,yx, yx,y 为非负整数)的整数 nnn 的个数。
* 数据范围:1≤l≤r≤1041 \leq l \leq r \leq 10^41≤l≤r≤104,区间长度不超过 10410^4104,数值范围较小。
* 复杂度要求:时间复杂度 O((r−l+1)⋅log2r)O((r-l+1) \cdot \log_2 r)O((r−l+1)⋅log2 r),由于 r≤104r \leq 10^4r≤104,双重循环枚举 222 的幂次(最多约 141414 层)完全满足 111s 时限;空间复杂度 O(1)O(1)O(1)。
* 算法知识点:枚举、暴力验证、位运算思想(虽然实现未使用位运算,但本质是判断二进制表示中 111 的个数是否不超过 222 个)
思路解析
1. 幂和数的判定:一个数 nnn 是幂和数,当且仅当存在非负整数 x,yx, yx,y 使得 2x+2y=n2^x + 2^y = n2x+2y=n。注意 xxx 可以等于 yyy(此时 n=2⋅2x=2x+1n = 2 \cdot 2^x = 2^{x+1}n=2⋅2x=2x+1,即 nnn 本身也是 222 的幂)。
2. 枚举验证:对于每个待验证的数 xxx,枚举所有可能的 2i2^i2i(iii 从 000 开始,直到 2i≤x2^i \leq x2i≤x),再枚举所有可能的 2j2^j2j,检查是否存在 2i+2j=x2^i + 2^j = x2i+2j=x。由于 214=16384>1042^{14} = 16384 > 10^4214=16384>104,内层循环最多执行约 14×14=19614 \times 14 = 19614×14=196 次,效率足够。
3. 区间统计:遍历区间 [l,r][l, r][l,r] 中的每个整数,调用判定函数,累加符合条件的数的个数。
完整代码