波波尼奥喜欢位操作。他想和你玩一个游戏。
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;
-
- }
- }
-
- }