Given an integer N, the task is to express the given number as the sum of K numbers where at least K – 1 numbers are distinct and are product of 2 primes. If no possible answer, exists, print -1.
Examples:
Input: N = 52, K = 5
Output: 6 10 14 15 7
Explanation:
N = 52 can be expressed as 6 10 14 15 2, where 15 = 3 * 5, 14 = 2*7, 10 = 2*5, 6 = 2*3, i.e, atleast 4 numbers are product of 2 distinct prime numbers.
Input: N = 44 K = 5
Output: -1
Explanation: It is not possible to express N as product of distinct numbers.
Approach: Follow the steps below to solve the problem:
- Store all prime numbers in a vector using Sieve of Eratosthenes.
- Iterate through the prime numbers stored and store the product of every pair of a prime number in another vector prod.
- Print the first K – 1 elements of prod vector
- If the sum of the first K – 1 elements of prod vector is more than N then print -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > primes;
void SieveOfEratosthenes()
{
bool prime[10005];
memset (prime, true , sizeof (prime));
for ( int p = 2; p * p <= 1000; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= 1000; i += p)
prime[i] = false ;
}
}
for ( int p = 2; p <= 1000; p++)
if (prime[p])
primes.push_back(p);
}
void generate( int n, int k)
{
vector< long long > prod;
SieveOfEratosthenes();
int l = primes.size();
for ( int i = 0; i < l; i++) {
for ( int j = i + 1; j < l; j++) {
if (primes[i] * primes[j] > 0)
prod.push_back(primes[i]
* primes[j]);
}
}
sort(prod.begin(), prod.end());
int sum = 0;
for ( int i = 0; i < k - 1; i++)
sum += prod[i];
if (sum > n)
cout << "-1" ;
else {
for ( int i = 0; i < k - 1; i++) {
cout << prod[i] << ", " ;
}
cout << n - sum << "\n" ;
}
}
int main()
{
int n = 52, k = 5;
generate(n, k);
return 0;
}
|
Java
import java.util.*;
class GFG{
static Vector<Integer> primes = new Vector<>();
static void SieveOfEratosthenes()
{
boolean []prime = new boolean [ 10005 ];
Arrays.fill(prime, true );
for ( int p = 2 ; p * p <= 1000 ; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= 1000 ; i += p)
prime[i] = false ;
}
}
for ( int p = 2 ; p <= 1000 ; p++)
if (prime[p])
primes.add(p);
}
static void generate( int n, int k)
{
Vector<Integer> prod = new Vector<>();
SieveOfEratosthenes();
int l = primes.size();
for ( int i = 0 ; i < l; i++)
{
for ( int j = i + 1 ; j < l; j++)
{
if (primes.get(i) * primes.get(j) > 0 )
prod.add(primes.get(i) *
primes.get(j));
}
}
Collections.sort(prod);
int sum = 0 ;
for ( int i = 0 ; i < k - 1 ; i++)
sum += prod.get(i);
if (sum > n)
System.out.print( "-1" );
else
{
for ( int i = 0 ; i < k - 1 ; i++)
{
System.out.print(prod.get(i) + ", " );
}
System.out.print(n - sum + "\n" );
}
}
public static void main(String[] args)
{
int n = 52 , k = 5 ;
generate(n, k);
}
}
|
Python3
primes = []
def SieveOfEratosthenes():
prime = [ True ] * 10005
p = 2
while p * p < = 1000 :
if (prime[p] = = True ):
for i in range (p * p, 1001 , p):
prime[i] = False
p + = 1
for p in range ( 2 , 1001 ):
if (prime[p]):
primes.append(p)
def generate(n, k):
prod = []
SieveOfEratosthenes()
l = len (primes)
for i in range (l):
for j in range (i + 1 , l):
if (primes[i] * primes[j] > 0 ):
prod.append(primes[i] *
primes[j])
prod.sort()
sum = 0
for i in range (k - 1 ):
sum + = prod[i]
if ( sum > n):
print ( "-1" )
else :
for i in range (k - 1 ):
print (prod[i], end = ", " )
print (n - sum )
if __name__ = = "__main__" :
n = 52
k = 5
generate(n, k)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static List< int > primes = new List< int >();
static void SieveOfEratosthenes()
{
bool []prime = new bool [10005];
for ( int i = 0; i < 10005; i++)
prime[i] = true ;
for ( int p = 2; p * p <= 1000; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= 1000; i += p)
prime[i] = false ;
}
}
for ( int p = 2; p <= 1000; p++)
if (prime[p])
primes.Add(p);
}
static void generate( int n, int k)
{
List< int > prod = new List< int >();
SieveOfEratosthenes();
int l = primes.Count;
for ( int i = 0; i < l; i++)
{
for ( int j = i + 1; j < l; j++)
{
if (primes[i] * primes[j] > 0)
prod.Add(primes[i] *
primes[j]);
}
}
prod.Sort();
int sum = 0;
for ( int i = 0; i < k - 1; i++)
sum += prod[i];
if (sum > n)
Console.Write( "-1" );
else
{
for ( int i = 0; i < k - 1; i++)
{
Console.Write(prod[i] + ", " );
}
Console.Write(n - sum + "\n" );
}
}
public static void Main(String[] args)
{
int n = 52, k = 5;
generate(n, k);
}
}
|
Javascript
<script>
let primes = new Array();
function SieveOfEratosthenes()
{
let prime = new Array(10005);
prime.fill( true );
for (let p = 2; p * p <= 1000; p++) {
if (prime[p] == true ) {
for (let i = p * p; i <= 1000; i += p)
prime[i] = false ;
}
}
for (let p = 2; p <= 1000; p++)
if (prime[p])
primes.push(p);
}
function generate(n, k)
{
let prod = new Array();
SieveOfEratosthenes();
let l = primes.length;
for (let i = 0; i < l; i++) {
for (let j = i + 1; j < l; j++) {
if (primes[i] * primes[j] > 0)
prod.push(primes[i]
* primes[j]);
}
}
prod.sort((a, b) => a - b)
let sum = 0;
for (let i = 0; i < k - 1; i++)
sum += prod[i];
if (sum > n)
document.write( "-1" );
else {
for (let i = 0; i < k - 1; i++) {
document.write(prod[i] + ", " );
}
document.write( n - sum + "<br>" );
}
}
let n = 52, k = 5;
generate(n, k);
</script>
|
Time complexity: O(N log N)
Auxiliary Space: O(N)