题解:CF2153B Bitwise Reversion
Chenxuhang_play · · 题解
题目传送门
题目:https://www.luogu.com.cn/problem/CF2153B
由于题面已经非常简洁了,故不在此赘述。
思路
众所周知,对于与运算,当且仅当两个运算的数均为
设
分类讨论如下情况:
-
x_i=0$,$y_i=0$,$z_i=0 这时只需要
a,b,c 在二进制下的第i 位均为0 即可。 -
x_i=0$,$y_i=0$,$z_i=1 可以构造
a_i=0 ,b_i=1 ,c_i=1 ,满足对应的条件。 -
x_i=0$,$y_i=1$,$z_i=1 可以发现,无论
a_i ,b_i ,c_i 取什么值,都无法满足这个条件。因为由y_i=1 ,z_i=1 可以推出a_i=1 ,b_i=1 ,c_i=1 。此时x_i=a_i\&b_i=1 ,与原题条件不符。x_i=1 ,y_i=0 ,x_i=1 和x_i=1 ,y_i=1 ,x_i=0 也是同理。 -
x_i=1$,$y_i=1$,$z_i=1 可以构造
a_i=1 ,b_i=1 ,c_i=1 ,满足对应条件。
综上所述,
代码实现
众所不一定周知,对于一个十进制数 (n>>i)&1 实现。有了这个点,代码就十分好实现了。
代码
#include<bits/stdc++.h>
# define chenxuhang_play return
# define code 0
using namespace std;
int main(){
long long t,x,y,z;
cin>>t;
while(t--)
{
cin>>x>>y>>z;
bool b=true;
for(int i=0;i<=31;i++)
{
if(((x>>i)&1)+((y>>i)&1)+((z>>i)&1)==2)
{
cout<<"NO\n";
b=false;
break;
}
}
if(b)cout<<"YES\n";
}
chenxuhang_play code;
}