Find N distinct numbers whose bitwise Or is equal to K - GeeksforGeeks

24 Mar, 2022
Given two integers N and K, the task is to find N distinct integers whose bit-wise OR is equal to K. If there does not exist any possible answer then print -1.Examples:  
Input: N = 3, K = 5 Output: 5 0 1 5 OR 0 OR 1 = 5Input: N = 10, K = 5 Output: -1 It is not possible to find any solution.  
 
Approach:  
We know that if bit-wise OR of a sequence of numbers is K then all the bit positions which are 0 in K must also be zero in all the numbers.So, we only have those positions to change where bit is 1 in K. Say that count is Bit_K.Now, we can form pow(2, Bit_K) distinct numbers with Bit_K bits. So if, we set one number to be K itself, then rest N – 1 numbers can be built by setting 0 all the bits in every number which are 0 in K and for other bit positions any permutation of Bit_K bits other than number K.If pow(2, Bit_K) < N then we cannot find any possible answer.
We know that if bit-wise OR of a sequence of numbers is K then all the bit positions which are 0 in K must also be zero in all the numbers.
So, we only have those positions to change where bit is 1 in K. Say that count is Bit_K.
Now, we can form pow(2, Bit_K) distinct numbers with Bit_K bits. So if, we set one number to be K itself, then rest N – 1 numbers can be built by setting 0 all the bits in every number which are 0 in K and for other bit positions any permutation of Bit_K bits other than number K.
If pow(2, Bit_K) < N then we cannot find any possible answer.
Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;#define ll long long int#define MAX 32 ll pow2[MAX];bool visited[MAX];vector<int> ans; // Function to pre-calculate// all the powers of 2 upto MAXvoid power_2(){    ll ans = 1;    for (int i = 0; i < MAX; i++) {        pow2[i] = ans;        ans *= 2;    }} // Function to return the// count of set bits in xint countSetBits(ll x){     // To store the count    // of set bits    int setBits = 0;    while (x != 0) {        x = x & (x - 1);        setBits++;    }     return setBits;} // Function to add num to the answer// by setting all bit positions as 0// which are also 0 in Kvoid add(ll num){    int point = 0;    ll value = 0;     for (ll i = 0; i < MAX; i++) {         // Bit i is 0 in K        if (visited[i])            continue;        else {            if (num & 1) {                value += (1 << i);            }            num /= 2;        }    }     ans.push_back(value);} // Function to find and print N distinct// numbers whose bitwise OR is Kvoid solve(ll n, ll k){     // Choosing K itself as one number    ans.push_back(k);     // Find the count of set bits in K    int countk = countSetBits(k);     // Impossible to get N    // distinct integers    if (pow2[countk] < n) {        cout << -1;        return;    }     int count = 0;    for (ll i = 0; i < pow2[countk] - 1; i++) {         // Add i to the answer after        // setting all the bits as 0        // which are 0 in K        add(i);        count++;         // If N distinct numbers are generated        if (count == n)            break;    }     // Print the generated numbers    for (int i = 0; i < n; i++) {        cout << ans[i] << " ";    }} // Driver codeint main(){    ll n = 3, k = 5;     // Pre-calculate all    // the powers of 2    power_2();     solve(n, k);     return 0;}
// Java implementation of the approachimport java.util.*; class GFG{     static final int MAX = 32; static long []pow2 = new long[MAX];static boolean []visited = new boolean[MAX];static Vector<Long> ans = new Vector<>(); // Function to pre-calculate// all the powers of 2 upto MAXstatic void power_2(){    long ans = 1;    for (int i = 0; i < MAX; i++)    {        pow2[i] = ans;        ans *= 2;    }} // Function to return the// count of set bits in xstatic int countSetBits(long x){     // To store the count    // of set bits    int setBits = 0;    while (x != 0)    {        x = x & (x - 1);        setBits++;    }     return setBits;} // Function to add num to the answer// by setting all bit positions as 0// which are also 0 in Kstatic void add(long num){    int point = 0;    long value = 0;     for (int i = 0; i < MAX; i++)    {         // Bit i is 0 in K        if (visited[i])            continue;        else        {            if (num %2== 1)            {                value += (1 << i);            }            num /= 2;        }    }     ans.add(value);} // Function to find and print N distinct// numbers whose bitwise OR is Kstatic void solve(long n, long k){     // Choosing K itself as one number    ans.add(k);     // Find the count of set bits in K    int countk = countSetBits(k);     // Impossible to get N    // distinct integers    if (pow2[countk] < n)    {        System.out.print(-1);        return;    }     int count = 0;    for (long i = 0; i < pow2[countk] - 1; i++)    {         // Add i to the answer after        // setting all the bits as 0        // which are 0 in K        add(i);        count++;         // If N distinct numbers are generated        if (count == n)            break;    }     // Print the generated numbers    for (int i = 0; i < n; i++)    {        System.out.print(ans.get(i)+" ");    }} // Driver codepublic static void main(String[] args){    long n = 3, k = 5;     // Pre-calculate all    // the powers of 2    power_2();     solve(n, k);}} // This code has been contributed by 29AjayKumar
# Python 3 implementation of the approachMAX = 32 pow2 = [0 for i in range(MAX)]visited = [False for i in range(MAX)]ans = [] # Function to pre-calculate# all the powers of 2 upto MAXdef power_2():    an = 1    for i in range(MAX):        pow2[i] = an        an *= 2 # Function to return the# count of set bits in xdef countSetBits(x):    # To store the count    # of set bits    setBits = 0    while (x != 0):        x = x & (x - 1)        setBits += 1         return setBits # Function to add num to the answer# by setting all bit positions as 0# which are also 0 in Kdef add(num):    point = 0    value = 0     for i in range(MAX):        # Bit i is 0 in K        if (visited[i]):            continue        else:            if (num & 1):                value += (1 << i)            num = num//2     ans.append(value) # Function to find and print N distinct# numbers whose bitwise OR is Kdef solve(n, k):    # Choosing K itself as one number    ans.append(k)     # Find the count of set bits in K    countk = countSetBits(k)     # Impossible to get N    # distinct integers    if (pow2[countk] < n):        print(-1)        return     count = 0    for i in range(pow2[countk] - 1):        # Add i to the answer after        # setting all the bits as 0        # which are 0 in K        add(i)        count += 1         # If N distinct numbers are generated        if (count == n):            break     # Print the generated numbers    for i in range(n):        print(ans[i],end = " ") # Driver codeif __name__ == '__main__':    n = 3    k = 5     # Pre-calculate all    # the powers of 2    power_2()     solve(n, k)     # This code is contributed by# Surendra_Gangwar
// C# implementation of the approachusing System;using System.Collections.Generic; class GFG{             static int MAX = 32;         static long [] pow2 = new long[MAX];    static bool [] visited = new bool[MAX];    static List<long> ans = new List<long>();         // Function to pre-calculate    // all the powers of 2 upto MAX    static void power_2()    {        long ans = 1;        for (int i = 0; i < MAX; i++)        {            pow2[i] = ans;            ans *= 2;        }    }         // Function to return the    // count of set bits in x    static int countSetBits(long x)    {             // To store the count        // of set bits        int setBits = 0;        while (x != 0)        {            x = x & (x - 1);            setBits++;        }             return setBits;    }         // Function to add num to the answer    // by setting all bit positions as 0    // which are also 0 in K    static void add(long num)    {                 long value = 0;             for (int i = 0; i < MAX; i++)        {                 // Bit i is 0 in K            if (visited[i])                continue;            else            {                if (num %2== 1)                {                    value += (1 << i);                }                num /= 2;            }        }             ans.Add(value);    }         // Function to find and print N distinct    // numbers whose bitwise OR is K    static void solve(long n, long k)    {             // Choosing K itself as one number        ans.Add(k);             // Find the count of set bits in K        int countk = countSetBits(k);             // Impossible to get N        // distinct integers        if (pow2[countk] < n)        {            Console.WriteLine(-1);            return;        }             int count = 0;        for (long i = 0; i < pow2[countk] - 1; i++)        {                 // Add i to the answer after            // setting all the bits as 0            // which are 0 in K            add(i);            count++;                 // If N distinct numbers are generated            if (count == n)                break;        }             // Print the generated numbers        for (int i = 0; i < n; i++)        {            Console.Write(ans[i]+ " ");        }    }         // Driver code    public static void Main()    {        long n = 3, k = 5;             // Pre-calculate all        // the powers of 2        power_2();             solve(n, k);    }} // This code is contributed by ihritik
<script>// Javascript implementation of the approach const MAX = 32; let pow2 = new Array(MAX);let visited = new Array(MAX);let ans = []; // Function to pre-calculate// all the powers of 2 upto MAXfunction power_2(){    let ans = 1;    for (let i = 0; i < MAX; i++) {        pow2[i] = ans;        ans *= 2;    }} // Function to return the// count of set bits in xfunction countSetBits(x){     // To store the count    // of set bits    let setBits = 0;    while (x != 0) {        x = x & (x - 1);        setBits++;    }     return setBits;} // Function to add num to the answer// by setting all bit positions as 0// which are also 0 in Kfunction add(num){    let point = 0;    let value = 0;     for (let i = 0; i < MAX; i++) {         // Bit i is 0 in K        if (visited[i])            continue;        else {            if (num & 1) {                value += (1 << i);            }            num = parseInt(num / 2);        }    }     ans.push(value);} // Function to find and print N distinct// numbers whose bitwise OR is Kfunction solve(n, k){     // Choosing K itself as one number    ans.push(k);     // Find the count of set bits in K    let countk = countSetBits(k);     // Impossible to get N    // distinct integers    if (pow2[countk] < n) {        document.write(-1);        return;    }     let count = 0;    for (let i = 0; i < pow2[countk] - 1; i++) {         // Add i to the answer after        // setting all the bits as 0        // which are 0 in K        add(i);        count++;         // If N distinct numbers are generated        if (count == n)            break;    }     // Print the generated numbers    for (let i = 0; i < n; i++) {        document.write(ans[i] + " ");    }} // Driver code    let n = 3, k = 5;     // Pre-calculate all    // the powers of 2    power_2();     solve(n, k); </script>
5 0 1
 
29AjayKumar
ihritik
SURENDRA_GANGWAR
subham348
simmytarika5
Bitwise-OR
Bit Magic
Mathematical
Mathematical
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Set, Clear and Toggle a given bit of a number in C
Check whether K-th bit is set or not
Program to find parity
Write an Efficient Method to Check if a Number is Multiple of 3
Hamming code Implementation in C/C++
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7