https://codeforces.com/problemset/problem/1842/B
题意:
有三摞书,要看书,可以随意选择那一摞看,但是必须按照顺序取书,一开始他的知识ans=0,
每一次看书(书的知识为a),ans = ans |a,他最喜欢的数字为x,看他读数获取的知识是否能达到x;
思路:
|的特点是有1就为1,&的特点是有0则为0,所以说他读取的书的知识二进制情况下不能在x没有1的情况下有1;
现在有一个数字a,如果a & x = a,说明在a(二进制)的零多于或等于x的0,就是说a中的0包含x中的0,在x有0的地方a都有0,a有0的地方x不一定有0。所以在这种情况下满足让他读的条件
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define ll long long
const int N = 1e5 + 9;
int z[4][N];
/*
|是有1则1
&是有0则0
*/
void slove()
{
int n, x;
cin >> n >> x;
int ans = 0;
for(int i = 1; i <= 3; i++)
{
for(int j = 1; j <= n; j++)
{
cin >> z[i][j];
}
}
int bz = 1;
for(int i = 1; i <= 3; i++)
{
bz = 1;
for(int j = 1; j <= n; j++)
{
if(bz == 1)
{
if((x & z[i][j]) == z[i][j])//二进制中没有多余的1,相等说明0的位置是一样的
{
ans |= z[i][j];
}
else
{
bz = 0;
}
}
}
}
if(ans != x)
{
cout << "NO\n";
}
else
{
cout << "YES\n";
}
}
int main()
{
std::ios::sync_with_stdio(false);
int t = 1;
cin >> t;
while(t--)
{
slove();
}
return 0;
}
|与&的关系
伊布