Encuentre N números distintos cuyo bit a bit O sea igual a K

Dados dos enteros N y K , la tarea es encontrar N enteros distintos cuyo OR bit a bit sea igual a K . Si no existe ninguna respuesta posible, imprima -1 .
Ejemplos: 
 

Entrada: N = 3, K = 5 
Salida: 5 0 1 
5 O 0 O 1 = 5
Entrada: N = 10, K = 5 
Salida: -1 
No es posible encontrar ninguna solución. 
 

Acercarse: 
 

  1. Sabemos que si el OR bit a bit de una secuencia de números es K , entonces todas las posiciones de bits que son 0 en K también deben ser cero en todos los números.
  2. Entonces, solo tenemos esas posiciones para cambiar donde el bit es 1 en K . Digamos que el recuento es Bit_K .
  3. Ahora, podemos formar pow(2, Bit_K) números distintos con Bit_K bits. Entonces, si configuramos un número para que sea K en sí mismo, entonces se pueden construir N – 1 números restantes configurando 0 todos los bits en cada número que son 0 en K y para otras posiciones de bits cualquier permutación de Bit_K bits que no sea el número K.
  4. Si pow(2, Bit_K) < N entonces no podemos encontrar ninguna respuesta posible.

A continuación se muestra la implementación del enfoque anterior: 
 

C++

// 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 MAX
void 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 x
int 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 K
void 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 K
void 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 code
int main()
{
    ll n = 3, k = 5;
 
    // Pre-calculate all
    // the powers of 2
    power_2();
 
    solve(n, k);
 
    return 0;
}

Java

// Java implementation of the approach
import 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 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)
{
    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 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)
    {
        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 code
public 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

Python3

# Python 3 implementation of the approach
MAX = 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 MAX
def power_2():
    an = 1
    for i in range(MAX):
        pow2[i] = an
        an *= 2
 
# Function to return the
# count of set bits in x
def 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 K
def 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 K
def 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 code
if __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#

// C# implementation of the approach
using 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

Javascript

<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 MAX
function 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 x
function 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 K
function 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 K
function 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>
Producción: 

5 0 1

 

Complejidad de tiempo: O (MAX)

Espacio Auxiliar: O(MAX)

Publicación traducida automáticamente

Artículo escrito por krikti y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *