从n个数中,选k个数,使其二进制的与运算最大
// #include <bits/stdc++.h>
// using namespace std;
// int a[100010], ori[100010];
// bool keep[100010];
// int n, k;
// uint32_t highbit(uint32_t x) {
// x = x | (x>>1);
// x = x | (x>>2);
// x = x | (x>>4);
// x = x | (x>>8);
// x = x | (x>>16);
// return (x>>1) + 1;
// }
// vector<int> find(int max_h) {
// vector<int> del;
// for (int i=0; i<n; i++) {
// if (keep[i]) {
// uint32_t h = highbit(a[i]);
// if (h != max_h) {
// del.push_back(i);
// }
// }
// }
// return del;
// }
// int main()
// {
// cin >> n >> k;
// for (int i=0; i<n; i++) {
// cin >> a[i];
// ori[i] = a[i];
// keep[i] = true;
// }
// // 找所有数的最高位
// int max_h = 0;
// for (int i=0; i<n; i++) {
// uint32_t h = highbit(a[i]);
// if (h > max_h) {
// max_h = h;
// }
// }
// int cnt = n;
// while (max_h) {
// vector<int> del = find(max_h); // 当前位为0的数的索引
// if (cnt - del.size() == k) {
// for (int k=0; k<del.size(); k++) {
// keep[del[k]] = false;
// }
// break;
// }
// else if (cnt - del.size() < k) { // 当前位为1的数不够k,所以这一位一定为0,因此用下一位筛选
// for (int i=0; i<n; i++) { // 该位为1的数 我减掉该位,继续求
// if (keep[i] && a[i] > max_h) a[i] = a[i] - max_h;
// }
// max_h = max_h/2;
// }
// else if (cnt - del.size() > k) { // 当前位为1的数>k,所以这一位一定为1,用该位筛掉那些要删除的数
// cnt = cnt - del.size();
// for (int k=0; k<del.size(); k++) { // 删掉该位为0的数
// keep[del[k]] = false;
// }
// for (int i=0; i<n; i++) { // 该位为1的数 我减掉该位,继续求
// if (keep[i] && a[i] > max_h) a[i] = a[i] - max_h;
// }
// max_h = max_h/2; // 用下一位筛选
// }
// }
// int ans=INT_MAX;
// for (int i=0; i<n; i++) {
// if (keep[i]) {
// ans = ans & ori[i];
// }
// }
// cout << ans << endl;
// return 0;
// }