Given two numbers N and K. The task is to print K numbers which are powers of 2 and their sum is N. Print -1 if not possible.
Examples:
Input: N = 9, K = 4 Output: 4 2 2 1 4 + 2 + 2 + 1 = 9 Input: N = 4, K = 5 Output: -1
Approach: The below algorithm can be followed to solve the above problem:
- If the K is less than the number of set bits in N or more than the number N, then it is not possible.
- Insert the powers of two at set bits into Priority Queue.
- Iterate in the Priority Queue till we get K elements, pop() the topmost element and
- push() element/2 twice into the Priority Queue again.
- Once K elements are achieved, print them.
Below is the implementation of the above approach:
C++
// CPP program to find k numbers that // are power of 2 and have sum equal // to N #include <bits/stdc++.h> using namespace std;
// function to print numbers void printNum( int n, int k)
{ // Count the number of set bits
int x = __builtin_popcount(n);
// Not-possible condition
if (k < x || k > n) {
cout << "-1" ;
return ;
}
// Stores the number
priority_queue< int > pq;
// Get the set bits
int two = 1;
while (n) {
if (n & 1) {
pq.push(two);
}
two = two * 2;
n = n >> 1;
}
// Iterate till we get K elements
while (pq.size() < k) {
// Get the topmost element
int el = pq.top();
pq.pop();
// Push the elements/2 into
// priority queue
pq.push(el / 2);
pq.push(el / 2);
}
// Print all elements
int ind = 0;
while (ind < k) {
cout << pq.top() << " " ;
pq.pop();
ind++;
}
} // Driver Code int main()
{ int n = 9, k = 4;
printNum(n, k);
return 0;
} |
Java
// Java program to find k numbers that // are power of 2 and have sum equal // to N import java.io.*;
import java.util.*;
class GFG
{ // function to print numbers
static void printNum( int n, int k)
{
// Count the number of set bits
String str = Integer.toBinaryString(n);
int x = 0 ;
for ( int i = 0 ; i < str.length(); i++)
if (str.charAt(i) == '1' )
x++;
// Not-possible condition
if (k < x || k > n)
{
System.out.println( "-1" );
return ;
}
// Stores the number
PriorityQueue<Integer> pq =
new PriorityQueue<>(Comparator.reverseOrder());
// Get the set bits
int two = 1 ;
while (n > 0 )
{
if ((n & 1 ) == 1 )
pq.add(two);
two *= 2 ;
n = n >> 1 ;
}
// Iterate till we get K elements
while (pq.size() < k)
{
// Get the topmost element
int el = pq.poll();
// Push the elements/2 into
// priority queue
pq.add(el / 2 );
pq.add(el / 2 );
}
// Print all elements
int ind = 0 ;
while (ind < k)
{
System.out.print(pq.poll() + " " );
ind++;
}
}
// Driver Code
public static void main(String[] args)
{
int n = 9 , k = 4 ;
printNum(n, k);
}
} // This code is contributed by // sanjeev2552 |
Python
# Python program to find k numbers that # are power of 2 and have sum equal # to N # function to print numbers def printNum(n, k):
# Count the number of set bits
x = 0
m = n
while (m):
x + = m & 1
m >> = 1
# Not-possible condition
if k < x or k > n:
print ( "-1" )
return
# Stores the number
pq = []
# Get the set bits
two = 1
while (n):
if (n & 1 ):
pq.append(two)
two = two * 2
n = n >> 1
# Iterate till we get K elements
while ( len (pq) < k):
# Get the topmost element
el = pq[ - 1 ]
pq.pop()
# append the elements/2 into
# priority queue
pq.append(el / / 2 )
pq.append(el / / 2 )
# Print all elements
ind = 0
pq.sort()
while (ind < k):
print (pq[ - 1 ], end = " " )
pq.pop()
ind + = 1
# Driver Code n = 9
k = 4
printNum(n, k) # This code is contributed by SHUBHAMSINGH10 |
C#
// C# program to find k numbers that // are power of 2 and have sum equal // to N using System;
using System.Collections.Generic;
public class GFG {
// function to print numbers
static void printNum( int n, int k)
{
// Count the number of set bits
int x = 0;
int m = n;
while (m > 0) {
x += m & 1;
m >>= 1;
}
// Not-possible condition
if (k < x || k > n) {
Console.WriteLine( "-1" );
return ;
}
// Stores the number
List< int > pq = new List< int >();
// Get the set bits
int two = 1;
while (n > 0) {
if ((n & 1) != 0)
pq.Add(two);
two = two * 2;
n = n >> 1;
}
// Iterate till we get K elements
while (pq.Count < k) {
// Get the topmost element
int el = pq[pq.Count - 1];
pq.RemoveAt(pq.Count - 1);
// append the elements/2 into
// priority queue
pq.Add(el / 2);
pq.Add(el / 2);
}
// Print all elements
int ind = 0;
pq.Sort();
while (ind < k) {
Console.Write(pq[pq.Count - 1] + " " );
pq.RemoveAt(pq.Count - 1);
ind += 1;
}
}
// Driver code
public static void Main( string [] args)
{
int n = 9;
int k = 4;
printNum(n, k);
}
} // This code is contributed by phasing17 |
Javascript
<script> // JavaScript program to find k numbers that // are power of 2 and have sum equal // to N // function to print numbers function printNum(n, k)
{ // Count the number of set bits
let x = 0
let m = n
while (m){
x += m & 1
m >>= 1
}
// Not-possible condition
if (k < x || k > n){
document.write( "-1" , "</br>" )
return
}
// Stores the number
let pq = []
// Get the set bits
let two = 1
while (n){
if (n & 1)
pq.push(two)
two = two * 2
n = n >> 1
}
// Iterate till we get K elements
while (pq.length < k){
// Get the topmost element
let el = pq[pq.length -1]
pq.pop()
// push the elements/2 into
// priority queue
pq.push(Math.floor(el / 2))
pq.push(Math.floor(el / 2))
}
// Print all elements
let ind = 0
pq.sort()
while (ind < k){
document.write(pq[pq.length -1], " " )
pq.pop()
ind += 1
}
} // Driver Code let n = 9 let k = 4 printNum(n, k) // This code is contributed by shinjanpatra </script> |
Output:
4 2 2 1
Time Complexity: O(N*logN), as we are using a loop to traverse N times and in each traversal we are using priority queue operation which will cost logN time.
Auxiliary Space: O(N), as we are using extra space for the priority queue.
Represent n as the sum of exactly k powers of two | Set 2