1 条题解
-
0
题目理解
给定一个正整数 ,要求找到一个正整数 ,使得:
- (即 和 在二进制下至少有一位同时为 )
- (即 和 在二进制下至少有一位不同)
要求输出任意一个满足条件的 。
提示解析
题目提示将 分为两种情况:
- (即 是 的幂次)
解题思路
设 表示 的第 位(从 开始), 表示 的第 位。
条件翻译:
情况一:
此时 的二进制表示中至少有两个 。
- 找到最低位 使得 (即 的最低位 的位置)
- 令 ,这样满足了第一个条件()
- 由于 还有另外的 ,而 只有这一位是 ,所以 ,因此 自动成立
所以此时 就是一个解。
情况二:
此时 的二进制表示中只有一个 。
- 先令 ,这样满足了第一个条件
- 但如果 只有这一位是 ,那么 ,此时 ,不满足第二个条件
- 因此需要再找一个最低位 使得 (即 在该位为 ),令
- 此时 有两位为 ,,,满足条件
所以此时 是一个解。
算法实现
标程使用了
lowbit函数(x & -x)来找到最低位的 。int w = lowbit(x); // w = 2^k,其中 k 是最低位 1 的位置 while (!(w ^ x) || !(w & x)) w++;解释:
- 初始
- 如果 ,即 ,说明 是 的幂,需要进入情况二
- 否则,直接输出 即可(情况一)
- 循环中的条件
!(w & x)实际上永远不会成立(因为 始终是 的某个位),这个写法可能是为了处理边界情况
更简洁的实现:
int lowbit = x & -x; if (x != lowbit) { cout << lowbit << endl; } else { // x 是 2 的幂,找一个最低的 0 位 int ans = lowbit; for (int j = 0; j < 31; j++) { if (!((x >> j) & 1)) { ans += (1 << j); break; } } cout << ans << endl; }
时间复杂度
每次查询,因为只需检查固定的位数( 或 位)。
完整代码(带注释)
#include <bits/stdc++.h> using namespace std; int main() { int T; cin >> T; while (T--) { int x; cin >> x; // lowbit = x 的最低位的 1 所表示的值 int lowbit = x & -x; if (x != lowbit) { // 情况一:x 不是 2 的幂 cout << lowbit << endl; } else { // 情况二:x 是 2 的幂 // 找到最低的 0 位 int ans = lowbit; for (int j = 0; j < 31; j++) { if (!((x >> j) & 1)) { ans += (1 << j); break; } } cout << ans << endl; } } return 0; }
举例验证
二进制 输出 验证 , ✓ , ✓ , ✓ , ✓
- 1
信息
- ID
- 6177
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者