啊啊啊啊啊啊
一开始想错了,以为只能是某一个数取并之后 必须得到一个 2的某次方 其实比如第三组数据
3
1 20 22
输出
2
20 22 (取并以后是20 20%4==0 oh fuck!)
意思应该是得到一个2的某次方的倍数就可以了。
思路:枚举每一位上的1。看这一位上的 1 是否可以满足条件。
当然 只要这个数的该位是1 就可以用来并 因为题目是要越多越好 而且越多的话也不会改变什么 有0的地方 再多的数也是0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
vector <int> ans;
int n;
int X[100005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&X[i]);
for(int i=30;i>=0;i--)
{
ans.clear();
int tmp=-1;
for(int j=1;j<=n;j++)
{
if(X[j]&(1<<i))
{
ans.push_back(X[j]);
if(tmp==-1)tmp=X[j];
else tmp&=X[j];
}
}
if(tmp%(1<<i)==0)break;
}
printf("%d\n%d",ans.size(),ans[0]);
for(int i=1;i<ans.size();i++)
printf(" %d",ans[i]);
puts("");
return 0;
}