Nth Subset of the Sequence consisting of powers of K in increasing order of their Sum

Given two integers N and K, the task is to find the Nth Subset from the sequence of subsets generated from the powers of K i.e. {1, K1, K2, K3, …..} such that the subsets are arranged in increasing order of their sum, the task is to find the Nth subset from the sequence.

Examples:

Input: N = 5, K = 3 
Output: 1 9 
Explanation: 
Sequence of subsets along with their sum are:

  • Subset = {1}, Sum = 1
  • Subset = {3}, Sum = 3
  • Subset = {1, 3}, Sum = 4
  • Subset = {9}, Sum = 9
  • Subset = {1, 9}, Sum = 10

Therefore, the subset at position 5 is {1, 9}.

Input: N = 4, K = 4 
Output: 16



Approach: 
Let’s refer to the required sequence for K = 3 given below:

From the above sequence, it can be observed that the subset {3} has position 2, the subset {9} has position 4, and the subset {27} has position 8, and so on. The subset {1, 3}, {1, 9}, {1, 27} occupies positions 3, 5, and 9 respectively. Hence, all the elements of the required Nth subset can be obtained by finding the nearest power of 2 which is smaller than or equal to N.

Illustration: 
N = 6, K = 3
1st iteration:

  1. p = log2(6) = 2
  2. 32 = 9, Subset = {9}
  3. N = 6 % 4 = 2

2nd iteration:

  1. p = log2(2) = 1
  2. 31 = 3, Subset = {3, 9}
  3. N = 2 % 2 = 0

Therefore the required subset is {3, 9}

Follow the steps below to solve the problem:

  • Calculate the nearest power of 2 which is smaller than or equal to N, say p. Therefore, p = log2N.
  • Now, the element of the subset will be Kp. Insert it into the front of the subset.
  • Update N to N % 2p.
  • Repeat the above steps until N becomes 0, and consequently print the obtained subset.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include
#include
using namespace std;
#define lli long long int
 
// Function to print the
// required N-th subset
void printSubset(lli n, int k)
{
    vector 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 < 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)

chevron_right


Output

1 16 





Time Complexity: O(logN) 
Auxiliary Space: O(1)

Approach: 

  • Initialize count and x by 0. Also, A vector to store the elements of the subsets.
  • Do the following while n is greater than 0.
    • Set x = n & 1, for finding the last bit of the number is set or not.
    • Now Push element 3count into the subset if n is not 0.
    • Reduce the number n by two with the help of right shifting by 1 unit.
    • Increase the count value by 1.
  • Finally, elements into the array are the elements of Nth subset.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
       
        // incresing 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

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for
// the above approach
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;
 
    // Incresing 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

chevron_right


Output

1 4 16 



Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.