波波尼奥喜欢位操作。他想和你玩一个游戏。
Boboniu给你两个非负整数序列a1,a2,...,an和b1,b2,...,bm。
对于每一个i(1≤i≤n),要求你选择一个j(1≤j≤m),并让ci=ai&bj,其中&表示位和操作。注意,你可以为不同的i选择相同的j。
找出最小可能的c1|c2|...|cn,其中|表示位向OR操作。
输入
第一行包含两个整数n和m(1≤n,m≤200)。
下一行包含n个整数a1,a2,...,an(0≤ai<29)。
下一行包含m个整数b1,b2,...,bm(0≤bi<29)。
输出
打印一个整数:最小可能的c1|c2|...|cn。
题解:
我们发现m,n和整数大小都不大,我们可以暴力从小到大枚举0~2^9,如果一旦又符合的直接输出即可
那么怎么判断符不符合呢?
c1|c2|...|cn我们设为c
根据或(|)的性质我们可以知道
c|任何一个(c1~cn)一定等于他本身
而ci = ai & bj
只要对于每个ai在j属于(1~m)中,有(ai&aj)|c == c即可
#include<iostream>
using namespace std;
int a[400],b[499];
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
}
for(int i = 1;i <= m;i++)
{
cin >> b[i];
}
// int ans = 0;
for(int i = 0;i <= (1<<9);i++)
{
int cnt = 0;
for(int j = 1;j <= n;j++)
{
int f = 0;
for(int k = 1;k <= m;k++)
{
if(((a[j]&b[k])|i) == i)
{
f = 1;
break;
}
}
if(f == 1)
{
cnt ++;
}
else
break;
}
if(cnt == n)
{
cout<<i;
return 0;
}
}
}