专栏文章
题解:CF2153B Bitwise Reversion
CF2153B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minm8scv
- 此快照首次捕获于
- 2025/12/02 04:42 3 个月前
- 此快照最后确认于
- 2025/12/02 04:42 3 个月前
Part 1 题意
现在,也就是说给了我们三个数 ,,,其中
我们需要判断是否存在 ,, 使得它们满足上面的条件。
Part 2 思路
我们考虑一下按位与运算的性质,当且仅当 。
我们按照二进制位来考虑,设 为 从右往左数二进制第 位的值。同理,我们也设 和 分别为 和 从右往左数二进制第 位的值。
我们来分情况讨论一下:
我们按照二进制位来考虑,设 为 从右往左数二进制第 位的值。同理,我们也设 和 分别为 和 从右往左数二进制第 位的值。
我们来分情况讨论一下:
- ,,。很明显,我们会发现这样一定是存在合法方案的。因为只要 ,, 这位上都是 即可。
- ,,。我们发现 ,也就是说 和 这位上都是 。只要 这一位上是 即可。
- ,,。我们发现,这种其实是不合法的方案。为什么呢?因为 和 ,说明这一位上 ,, 上都是 。那么,在这种情况下, 的值也一定是 ,但是这里给出的是 ,所以不合法。
通过上面举出的三个例子,我们可以发现规律:
只要 、、 这三个数里面有两个是 ,那么这一定是不合法方案,因为这就代表了三个数这一位上都是 ,不可能有一个出现 。只要所有的 都是合法的,那么存在一种合法方案。
只要 、、 这三个数里面有两个是 ,那么这一定是不合法方案,因为这就代表了三个数这一位上都是 ,不可能有一个出现 。只要所有的 都是合法的,那么存在一种合法方案。
Part 3 代码
CPP#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x, y, z;
void work() {
cin >> x >> y >> z;
for (ll i = 0; i <= 31; i ++) {
ll a = ((x >> i) & 1), b = ((y >> i) & 1), c = ((z >> i) & 1);
// cout << "i = " << i << " a = " << a << " b = " << b << " c = " << c << " \n";
if (a == 0 && b == 1 && c == 1) {
cout << "NO\n";
return ;
}
if (a == 1 && b == 1 && c == 0) {
cout << "NO\n";
return ;
}
if (a == 1 && b == 0 && c == 1) {
cout << "NO\n";
return ;
}
}
cout << "YES\n";
}
int main() {
int _; cin >> _;
while (_ --) work();
return 0;
}
这里解释一下代码,代码中的 、、 分别对应着上面的 、、。
总复杂度应该是 , 表示测试组数, 表示 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...