Dados dos números enteros N y K , la tarea es encontrar el subconjunto N a partir de la secuencia de subconjuntos generados a partir de las potencias de K, es decir, {1, K 1 , K 2 , K 3 , …..} de manera que los subconjuntos estén ordenados en orden creciente de su suma, la tarea es encontrar el N- ésimo subconjunto de la secuencia.
Ejemplos:
Entrada: N = 5, K = 3
Salida: 1 9
Explicación:
La secuencia de subconjuntos junto con su suma son:
- Subconjunto = {1}, Suma = 1
- Subconjunto = {3}, Suma = 3
- Subconjunto = {1, 3}, Suma = 4
- Subconjunto = {9}, Suma = 9
- Subconjunto = {1, 9}, Suma = 10
Por lo tanto, el subconjunto en la posición 5 es {1, 9}.
Entrada: N = 4, K = 4
Salida: 16
Enfoque:
vamos a referirnos a la secuencia requerida para K = 3 dada a continuación:
De la secuencia anterior, se puede observar que el subconjunto {3} tiene la posición 2, el subconjunto {9} tiene la posición 4 y el subconjunto {27} tiene la posición 8, y así sucesivamente. El subconjunto {1, 3}, {1, 9}, {1, 27} ocupa las posiciones 3, 5 y 9 respectivamente. Por lo tanto, todos los elementos del N -ésimo subconjunto requerido se pueden obtener encontrando la potencia de 2 más cercana que sea menor o igual que N.
Ilustración:
N = 6, K = 3
1ra iteración:
- p = registro 2 (6) = 2
- 3 2 = 9, Subconjunto = {9}
- n = 6 % 4 = 2
2da iteración:
- p = registro 2 (2) = 1
- 3 1 = 3, Subconjunto = {3, 9}
- n = 2 % 2 = 0
Por lo tanto, el subconjunto requerido es {3, 9}
Siga los pasos a continuación para resolver el problema:
- Calcula la potencia de 2 más cercana que sea menor o igual a N , digamos p . Por lo tanto, p = log 2 N .
- Ahora, el elemento del subconjunto será K p . Insértelo en la parte frontal del subconjunto.
- Actualizar N a N % 2 p .
- Repita los pasos anteriores hasta que N se convierta en 0 y, en consecuencia, imprima el subconjunto obtenido.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> #include <stdio.h> using namespace std; #define lli long long int // Function to print the // required N-th subset void printSubset(lli n, int k) { vector<lli> answer; while(n > 0) { // Nearest power of 2<=N lli p = log2(n); // Now insert k^p in the answer answer.push_back(pow(k, p)); // update n n %= (int)pow(2, p); } // Print the ans in sorted order reverse(answer.begin(), answer.end()); for(auto x: answer) { cout << x << " "; } } // Driver Code int main() { lli n = 5; int k = 4; printSubset(n, k); } // This code is contributed by winter_soldier
Java
// Java program for above approach import java.util.*; import java.lang.*; import java.io.*; class GFG { // Function to print the // required N-th subset static void printSubset(long n, int k) { ArrayList<Long> answer = new ArrayList<>(); while(n > 0) { // Nearest power of 2<=N long p = (long)(Math.log(n) / Math.log(2));; // Now insert k^p in the answer answer.add((long)(Math.pow(k, p))); // update n n %= (int)Math.pow(2, p); } // Print the ans in sorted order Collections.sort(answer); for(Long x: answer) { System.out.print(x + " "); } } // Driver function public static void main (String[] args) { long n = 5; int k = 4; printSubset(n, k); } } // This code is contributed by offbeat
Python3
# Python3 program for # the above approach import math # Function to print the # required N-th subset def printSubset(N, K): # Stores the subset answer = "" while(N > 0): # Nearest power of 2 <= N p = int(math.log(N, 2)) # Insert K ^ p in the subset answer = str(K**p)+" "+answer # Update N N = N % (2**p) # Print the subset print(answer) # Driver Code N = 5 K = 4 printSubset(N, K)
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG { // Function to print the // required N-th subset static void printSubset(int n, int k) { List<int> answer = new List<int>(); while(n > 0) { // Nearest power of 2<=N int p = (int)Math.Log(n,2); // Now insert k^p in the answer answer.Add((int)Math.Pow(k, p)); // update n n %= (int)Math.Pow(2, p); } // Print the ans in sorted order answer.Reverse(); foreach(int x in answer) { Console.Write(x + " "); } } // Driver code static void Main() { int n = 5; int k = 4; printSubset(n, k); } } // This code is contributed by divyeshrabadiya07.
Javascript
<script> // Javascript program for the above approach // Function to print the // required N-th subset function printSubset(n, k) { var answer = []; while(n > 0) { // Nearest power of 2<=N var p = parseInt(Math.log2(n)); // Now insert k^p in the answer answer.push(Math.pow(k, p)); // update n n %= parseInt(Math.pow(2, p)); } // Print the ans in sorted order answer.sort(); //reverse(answer.begin(), answer.end()); for(var i=0;i<answer.length;i++) { document.write(answer[i] + " "); } } var n = 5; var k = 4; printSubset(n, k); //This code is contributed by SoumikMondal </script>
1 16
Complejidad temporal: O(logN)
Espacio auxiliar: O(1)
Acercarse:
- Inicializa el conteo y x por 0. Además, un vector para almacenar los elementos de los subconjuntos.
- Haga lo siguiente mientras n sea mayor que 0.
- Establecer x = n & 1, para encontrar si el último bit del número está establecido o no.
- Ahora Empuje la cuenta del elemento 3 en el subconjunto si n no es 0.
- Reduzca el número n en dos con la ayuda del desplazamiento a la derecha en 1 unidad.
- Aumente el valor de conteo en 1.
- Finalmente, los elementos de la array son los elementos del N-ésimo subconjunto.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to print subset // at the nth position ordered // by the sum of the elements #include <bits/stdc++.h> using namespace std; // Function to print the elements of // the subset at pos n void printsubset(int n,int k) { // Initialize count=0 and x=0 int count = 0, x = 0; // create a vector for // storing the elements // of subsets vector<int> vec; // doing until all the // set bits of n are used while (n) { x = n & 1; // this part is executed only // when the last bit is // set if (x) { vec.push_back(pow(k, count)); } // right shift the bit by one position n = n >> 1; // increasing the count each time by one count++; } // printing the values os elements for (int i = 0; i < vec.size(); i++) cout << vec[i] << " "; } // Driver Code int main() { int n = 7,k=4; printsubset(n,k); return 0; } // This code is contributed by shivkant
Java
// Java program to print subset // at the nth position ordered // by the sum of the elements import java.util.*; import java.lang.*; class GFG{ // Function to print the // elements of the subset // at pos n static void printsubset(int n, int k) { // Initialize count=0 and x=0 int count = 0, x = 0; // Create a vector for // storing the elements // of subsets ArrayList<Integer> vec = new ArrayList<>(); // Doing until all the // set bits of n are used while (n != 0) { x = n & 1; // This part is executed only // when the last bit is // set if (x != 0) { vec.add((int)Math.pow(k, count)); } // Right shift the bit // by one position n = n >> 1; // Increasing the count // each time by one count++; } // Printing the values os elements for (int i = 0; i < vec.size(); i++) System.out.print(vec.get(i) + " "); } // Driver function public static void main (String[] args) { int n = 7, k = 4; printsubset(n, k); } } // This code is contributed by offbeat
Python3
# Python3 program to print subset # at the nth position ordered # by the sum of the elements import math # Function to print the elements of # the subset at pos n def printsubset(n, k): # Initialize count=0 and x=0 count = 0 x = 0 # Create a vector for # storing the elements # of subsets vec = [] # Doing until all the # set bits of n are used while (n > 0): x = n & 1 # This part is executed only # when the last bit is # set if (x): vec.append(pow(k, count)) # Right shift the bit by one position n = n >> 1 # Increasing the count each time by one count += 1 # Printing the values os elements for item in vec: print(item, end = " ") # Driver Code n = 7 k = 4 printsubset(n, k) # This code is contributed by Stream_Cipher
C#
// C# program to print subset // at the nth position ordered // by the sum of the elements using System.Collections.Generic; using System; class GFG{ // Function to print the // elements of the subset // at pos n static void printsubset(int n, int k) { // Initialize count=0 and x=0 int count = 0, x = 0; // Create a vector for // storing the elements // of subsets List<int> vec = new List<int>(); // Doing until all the // set bits of n are used while (n != 0) { x = n & 1; // This part is executed only // when the last bit is // set if (x != 0) { vec.Add((int)Math.Pow(k, count)); } // Right shift the bit // by one position n = n >> 1; // Increasing the count // each time by one count++; } // Printing the values os elements for(int i = 0; i < vec.Count; i++) Console.Write(vec[i] + " "); } // Driver code public static void Main () { int n = 7, k = 4; printsubset(n, k); } } // This code is contributed by Stream_Cipher
Javascript
<script> // Javascript program to print subset // at the nth position ordered // by the sum of the elements // Function to print the // elements of the subset // at pos n function printsubset(n, k) { // Initialize count=0 and x=0 let count = 0, x = 0; // Create a vector for // storing the elements // of subsets let vec = []; // Doing until all the // set bits of n are used while (n != 0) { x = n & 1; // This part is executed only // when the last bit is // set if (x != 0) { vec.push(Math.pow(k, count)); } // Right shift the bit // by one position n = n >> 1; // Increasing the count // each time by one count++; } // Printing the values os elements for(let i = 0; i < vec.length; i++) document.write(vec[i] + " "); } let n = 7, k = 4; printsubset(n, k); </script>
1 4 16
Publicación traducida automáticamente
Artículo escrito por poulami21ghosh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA