在C ++中找到按位或等于K的N个不同的数字

概念

对于给定的两个整数N和K,我们的任务是确定N个不同的整数,它们的按位OR等于K。已经发现,如果不存在任何可能的答案,则打印-1。

输入项

N = 4, K = 6

输出结果

6 0 1 2

输入项

N = 11, K = 6

输出结果

-1

找不到任何解决方案。

方法

  • 我们知道,如果一个数字序列的按位“或”为K,则所有K中为0的所有位索引也必须为零。

  • 结果,我们只有那些位置可以更改,其中K中的bit为1。让该计数为Bit_K。

  • 目前,我们可以使用Bit_K位创建pow(2,Bit_K)不同的数字。结果,如果我们将一个数字本身视为K,则可以通过将每个数字中所有在K中为0的所有位设置为0以及对其他位位置对Bit_K进行任意排列,来构造剩余的N – 1数字K以外的其他位。

  • 已经看到,如果pow(2,Bit_K)<N,则我们无法确定任何可能的答案。

示例

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define MAX1 32
ll pow2[MAX1];
bool visited1[MAX1];
vector<int> ans1;
//显示函数进行预计算
//所有2的幂直到MAX-
void power_2(){
   ll ans1 = 1;
   for (int i = 0; i < MAX1; i++) {
      pow2[i] = ans1;
      ans1 *= 2;
   }
}
//显示函数返回
//x中设置位的数量
int countSetBits(ll x1){
   //用于存储计数
   //设置位
   int setBits1 = 0;
   while (x1 != 0) {
      x1 = x1 & (x1 - 1);
      setBits1++;
   }
   return setBits1;
}
//显示将num添加到答案的功能
//通过将所有位位置设置为0-
//在K中也为0-
void add(ll num1){
   int point1 = 0;
   ll value1 = 0;
   for (ll i = 0; i < MAX1; i++) {
      //K中的位i为0-
      if (visited1[i])
         continue;
      else {
         if (num1 & 1) {
            value1 += (1 << i);
         }
         num1 /= 2;
      }
   }
   ans1.push_back(value1);
}
//显示查找和打印N个不同字符的功能
//按位或为K的数字
void solve(ll n1, ll k1){
   //选择K本身为一个数字
   ans1.push_back(k1);
   // Find the count设置位 in K
   int countk1 = countSetBits(k1);
   //无法获得N-
   //不同的整数
   if (pow2[countk1] < n1) {
      cout << -1;
      return;
   }
   int count1 = 0;
   for (ll i = 0; i < pow2[countk1] - 1; i++) {
      //之后将我添加到答案中
      //将所有位设置为0-
      //在K中为0-
      add(i);
      count1++;
      //现在,如果生成了N个不同的数字
      if (count1 == n1)
         break;
   }
   //现在打印生成的数字
   for (int i = 0; i < n1; i++) {
      cout << ans1[i] << " ";
   }
}
//驱动程式码
int main(){
   ll n1 = 4, k1 = 6;
   //预先计算所有
   //2的幂
   power_2();
   solve(n1, k1);
   return 0;
}

输出结果

6 0 1 2