Nth Subset of the Sequence consisting of powers of K in increasing order of their Sum
Last Updated : 20 Oct, 2022
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:
The 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:
- p = log2(6) = 2
- 32 = 9, Subset = {9}
- N = 6 % 4 = 2
2nd iteration:
- p = log2(2) = 1
- 31 = 3, Subset = {3, 9}
- 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++
#include <bits/stdc++.h> #include <stdio.h> using namespace std; #define lli long long int void printSubset(lli n, int k) { vector<lli> answer; while (n > 0) { lli p = log2(n); answer.push_back( pow (k, p)); n %= ( int ) pow (2, p); } reverse(answer.begin(), answer.end()); for ( auto x: answer) { cout << x << " " ; } } int main() { lli n = 5; int k = 4; printSubset(n, k); } |
Java
import java.util.*; import java.lang.*; import java.io.*; class GFG { static void printSubset( long n, int k) { ArrayList<Long> answer = new ArrayList<>(); while (n > 0 ) { long p = ( long )(Math.log(n) / Math.log( 2 ));; answer.add(( long )(Math.pow(k, p))); n %= ( int )Math.pow( 2 , p); } Collections.sort(answer); for (Long x: answer) { System.out.print(x + " " ); } } public static void main (String[] args) { long n = 5 ; int k = 4 ; printSubset(n, k); } } |
Python3
import math def printSubset(N, K): answer = "" while (N > 0 ): p = int (math.log(N, 2 )) answer = str (K * * p) + " " + answer N = N % ( 2 * * p) print (answer) N = 5 K = 4 printSubset(N, K) |
C#
using System; using System.Collections.Generic; class GFG { static void printSubset( int n, int k) { List< int > answer = new List< int >(); while (n > 0) { int p = ( int )Math.Log(n,2); answer.Add(( int )Math.Pow(k, p)); n %= ( int )Math.Pow(2, p); } answer.Reverse(); foreach ( int x in answer) { Console.Write(x + " " ); } } static void Main() { int n = 5; int k = 4; printSubset(n, k); } } |
Javascript
<script> function printSubset(n, k) { var answer = []; while (n > 0) { var p = parseInt(Math.log2(n)); answer.push(Math.pow(k, p)); n %= parseInt(Math.pow(2, p)); } answer.sort(); for ( var i=0;i<answer.length;i++) { document.write(answer[i] + " " ); } } var n = 5; var k = 4; printSubset(n, k); </script> |
Time Complexity: O(logN)
Auxiliary Space: O(logN)
Approach:
- Initialize the 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 if 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, the elements in the array are the elements of the Nth subset.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h> using namespace std; void printsubset( int n, int k) { int count = 0, x = 0; vector< int > vec; while (n) { x = n & 1; if (x) { vec.push_back( pow (k, count)); } n = n >> 1; count++; } for ( int i = 0; i < vec.size(); i++) cout << vec[i] << " " ; } int main() { int n = 7,k=4; printsubset(n,k); return 0; } |
Java
import java.util.*; import java.lang.*; class GFG{ static void printsubset( int n, int k) { int count = 0 , x = 0 ; ArrayList<Integer> vec = new ArrayList<>(); while (n != 0 ) { x = n & 1 ; if (x != 0 ) { vec.add(( int )Math.pow(k, count)); } n = n >> 1 ; count++; } for ( int i = 0 ; i < vec.size(); i++) System.out.print(vec.get(i) + " " ); } public static void main (String[] args) { int n = 7 , k = 4 ; printsubset(n, k); } } |
Python3
import math def printsubset(n, k): count = 0 x = 0 vec = [] while (n > 0 ): x = n & 1 if (x): vec.append( pow (k, count)) n = n >> 1 count + = 1 for item in vec: print (item, end = " " ) n = 7 k = 4 printsubset(n, k) |
C#
using System.Collections.Generic; using System; class GFG{ static void printsubset( int n, int k) { int count = 0, x = 0; List< int > vec = new List< int >(); while (n != 0) { x = n & 1; if (x != 0) { vec.Add(( int )Math.Pow(k, count)); } n = n >> 1; count++; } for ( int i = 0; i < vec.Count; i++) Console.Write(vec[i] + " " ); } public static void Main () { int n = 7, k = 4; printsubset(n, k); } } |
Javascript
<script> function printsubset(n, k) { let count = 0, x = 0; let vec = []; while (n != 0) { x = n & 1; if (x != 0) { vec.push(Math.pow(k, count)); } n = n >> 1; count++; } for (let i = 0; i < vec.length; i++) document.write(vec[i] + " " ); } let n = 7, k = 4; printsubset(n, k); </script> |
Time Complexity: O(log2N)
Auxiliary Space: O(log2N)
Similar Reads
Sum of maximum and minimum of Kth subset ordered by increasing subset sum
Given an integer N and a set of all non-negative powers of N as S = {N0, N1, N2, N3, ... }, arrange all non-empty subsets of S in increasing order of subset-sum. The task is to find the sum of the greatest and smallest elements of the Kth subset from that ordering. Examples: Input: N = 4, K = 3Outpu
7 min read
Print the sequence of size N in which every term is sum of previous K terms
Given two integers N and K, the task is to generate a series of N terms in which every term is sum of the previous K terms.Note: The first term of the series is 1. if there are not enough previous terms, then other terms are supposed to be 0.Examples: Input: N = 8, K = 3 Output: 1 1 2 4 7 13 24 44 E
11 min read
Represent n as the sum of exactly k powers of two | Set 2
Given two integers n and k, the task is to find whether it is possible to represent n as the sum of exactly k powers of 2. If possible then print k positive integers such that they are powers of 2 and their sum is exactly equal to n else print Impossible. Examples: Input: n = 9, k = 4 Output: 1 2 2
7 min read
Represent N as the sum of exactly K powers of two | Set 3
Given two integers N and K, the task is to find whether it is possible to represent N as the sum of exactly K powers of 2. If possible, then print K positive integers such that they are powers of 2 and their sum is exactly equal to N. Otherwise, print "Impossible". If multiple answers exist, print a
7 min read
Count number of increasing sub-sequences : O(NlogN)
Given an array arr[] of length N, the task is to find the number of strictly increasing sub-sequences in the given array. Examples: Input: arr[] = {1, 2, 3} Output: 7 All increasing sub-sequences will be: 1) {1} 2) {2} 3) {3} 4) {1, 2} 5) {1, 3} 6) {2, 3} 7) {1, 2, 3} Thus, answer = 7Input: arr[] =
12 min read
Find K that requires minimum increments or decrements of array elements to obtain a sequence of increasing powers of K
Given an array consisting of N integers, the task is to find the integer K which requires the minimum number of moves to convert the given array to a sequence of powers of K, i.e. {K0, K1, K2, ......., KN - 1}. In each move, increase or decrease an array element by one. Examples: Input: arr[] = {1,
7 min read
Count of distinct integers in range [1, N] that do not have any subset sum as K
Given two positive integers N and K such that K?N, the task is to find the maximum number of distinct integers in the range [1, N] having no subset with a sum equal to K. If there are multiple solutions, print any. Examples: Input: N = 5, K = 3Output: 1 4 5Explanation: There are two sets of distinct
6 min read
Sum of products of all possible K size subsets of the given array
Given an array arr[] of N non-negative integers and an integer 1 ? K ? N. The task is to find the sum of the products of all possible subsets of arr[] of size K. Examples: Input: arr[] = {1, 2, 3, 4}, K = 2 Output: 35 (1 * 2) + (1 * 3) + (1 * 4) + (2 * 3) + (2 * 4) + (3 * 4) = 2 + 3 + 4 + 6 + 8 + 12
15+ min read
Minimum number of insertions required such that first K natural numbers can be obtained as sum of a subsequence of the array
Given an array arr[] consisting of N positive integers and a positive integer K, the task is to find the minimum number of elements that are required to be inserted such that all numbers from the range [1, K] can be obtained as the sum of any subsequence of the array. Examples: Input: arr[] = {1, 3,
8 min read
Sum of subsets of all the subsets of an array | O(N)
Given an array arr[] of length N, the task is to find the overall sum of subsets of all the subsets of the array.Examples: Input: arr[] = {1, 1} Output: 6 All possible subsets: a) {} : 0 All the possible subsets of this subset will be {}, Sum = 0 b) {1} : 1 All the possible subsets of this subset wi
7 min read