# Find k numbers which are powers of 2 and have sum N | Set 1

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 = 4Output:4 2 2 1 4 + 2 + 2 + 1 = 9Input:N = 4, K = 5Output:-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 prnumbers ` `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` `)` ` ` ` ` `# Prall 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` |

**Output:**

4 2 2 1

Represent n as the sum of exactly k powers of two | Set 2