Given two positive integers K and X, the task is to find the minimum possible sum of K positive integers ( repetitions allowed ) having LCM X.
Examples:
Input: K = 2, X = 6
Output: 5
Explanation:
K(= 2) positive integers of minimum possible sum having LCM X(= 6) are { 2, 3 }.
Therefore, the minimum possible sum of K(= 2) positive integers = (2 + 3) = 5.
Therefore, the required output is 5.
Input: K = 3 X = 11
Output: 13
Explanation:
K(= 3) positive integers of minimum possible sum having LCM X(= 11) are { 1, 1, 11 }.
Therefore, the minimum possible sum of K(= 3) positive integers = (1 + 1 + 11) = 13.
Therefore, the required output is 13.
Approach: The problem can be solved using Greedy technique. The idea is to represent X in the form of a product of prime powers. Select K prime powers from all the prime powers of X in all possible ways and calculate their respective sums. Finally, print the minimum possible sum among all of them. Follow the steps below to solve the problem:
- Initialize an array, say primePow[], to store all the prime powers of X.
- If length of the array primePow[] is less than or equal to K, then include all the array elements of primePow[] in K positive integer and the remaining element Of K positive integers must be 1. Finally, print the sum of K positive integers
Illustration:
If K = 5, X = 240
primePow[] = { 24, 31, 51 } = { 16, 3, 5 }
K positive integers will be { 16, 3, 5, 1, 1 }
Therefore, the sum of K positive integers will be 26
- Otherwise, partition the primePow[] array into K groups in all possible ways and calculate their respective sums. Finally, print the minimum sum of the K positive integers.
If K = 3, X = 210
primePow[] = { 21, 31, 51, 51 } = { 2, 3, 5, 7 }
Partition primePow[] array into { { 2, 3 }, { 5 }, { 7 } }
210 = (2 * 3) * (5) * 7 = 6 * 5 * 7
K positive integers will be { 6, 5, 7 }
Therefore, the sum of K(= 3) positive integers will be 18
Below is the implementation of the above implementation:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > primePower( int X)
{
vector< int > primePow;
for ( int i = 2; i * i <= X; i++) {
if (X % i == 0) {
int p = 1;
while (X % i == 0) {
X /= i;
p *= i;
}
primePow.push_back(p);
}
}
if (X > 1) {
primePow.push_back(X);
}
return primePow;
}
int getSum(vector< int >& ar)
{
int sum = 0;
for ( int i : ar) {
sum += i;
}
return sum;
}
int getMinSum( int pos, vector< int >& arr,
vector< int >& primePow)
{
if (pos == primePow.size()) {
return getSum(arr);
}
int res = INT_MAX;
for ( int i = 0; i < arr.size();
i++) {
arr[i] *= primePow[pos];
res = min(res, getMinSum(pos + 1,
arr, primePow));
arr[i] /= primePow[pos];
}
return res;
}
int minimumSumWithGivenLCM( int k, int x)
{
vector< int > primePow = primePower(x);
int n = primePow.size();
int sum = 0;
if (n <= k) {
for ( int i : primePow) {
sum += i;
}
sum += k - n;
}
else {
vector< int > arr(k, 1);
sum = getMinSum(0, arr, primePow);
}
return sum;
}
int main()
{
int k = 3, x = 210;
cout << minimumSumWithGivenLCM(k, x);
return 0;
}
|
Java
import java.util.*;
class GFG{
static Vector<Integer> primePower( int X)
{
Vector<Integer> primePow = new Vector<Integer>();
for ( int i = 2 ; i * i <= X; i++) {
if (X % i == 0 ) {
int p = 1 ;
while (X % i == 0 ) {
X /= i;
p *= i;
}
primePow.add(p);
}
}
if (X > 1 ) {
primePow.add(X);
}
return primePow;
}
static int getSum( int []ar)
{
int sum = 0 ;
for ( int i : ar) {
sum += i;
}
return sum;
}
static int getMinSum( int pos, int []arr,
Vector<Integer> primePow)
{
if (pos == primePow.size()) {
return getSum(arr);
}
int res = Integer.MAX_VALUE;
for ( int i = 0 ; i < arr.length;
i++) {
arr[i] *= primePow.get(pos);
res = Math.min(res, getMinSum(pos + 1 ,
arr, primePow));
arr[i] /= primePow.get(pos);
}
return res;
}
static int minimumSumWithGivenLCM( int k, int x)
{
Vector<Integer> primePow = primePower(x);
int n = primePow.size();
int sum = 0 ;
if (n <= k) {
for ( int i : primePow) {
sum += i;
}
sum += k - n;
}
else {
int []arr = new int [k];
Arrays.fill(arr, 1 );
sum = getMinSum( 0 , arr, primePow);
}
return sum;
}
public static void main(String[] args)
{
int k = 3 , x = 210 ;
System.out.print(minimumSumWithGivenLCM(k, x));
}
}
|
Python3
def primePower(X):
primePow = []
for i in range ( 2 , X + 1 ):
if i * i > X + 1 :
break
if (X % i = = 0 ):
p = 1
while (X % i = = 0 ):
X / / = i
p * = i
primePow.append(p)
if (X > 1 ):
primePow.append(X)
return primePow
def getSum(ar):
sum = 0
for i in ar:
sum + = i
return sum
def getMinSum(pos, arr, primePow):
if (pos = = len (primePow)):
return getSum(arr)
res = 10 * * 9
for i in range ( len (arr)):
arr[i] * = primePow[pos]
res = min (res, getMinSum(pos + 1 , arr, primePow))
arr[i] / / = primePow[pos]
return res
def minimumSumWithGivenLCM(k, x):
primePow = primePower(x)
n = len (primePow)
sum = 0
if (n < = k):
for i in primePow:
sum + = i
sum + = k - n
else :
arr = [ 1 ] * (k)
sum = getMinSum( 0 , arr, primePow)
return sum
if __name__ = = '__main__' :
k = 3
x = 210
print (minimumSumWithGivenLCM(k, x))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static List< int > primePower( int X)
{
List< int > primePow = new List< int >();
for ( int i = 2; i * i <= X; i++)
{
if (X % i == 0)
{
int p = 1;
while (X % i == 0)
{
X /= i;
p *= i;
}
primePow.Add(p);
}
}
if (X > 1)
{
primePow.Add(X);
}
return primePow;
}
static int getSum( int []ar)
{
int sum = 0;
foreach ( int i in ar)
{
sum += i;
}
return sum;
}
static int getMinSum( int pos, int []arr,
List< int > primePow)
{
if (pos == primePow.Count)
{
return getSum(arr);
}
int res = int .MaxValue;
for ( int i = 0; i < arr.Length; i++)
{
arr[i] *= primePow[pos];
res = Math.Min(res, getMinSum(
pos + 1, arr, primePow));
arr[i] /= primePow[pos];
}
return res;
}
static int minimumSumWithGivenLCM( int k, int x)
{
List< int > primePow = primePower(x);
int n = primePow.Count;
int sum = 0;
if (n <= k)
{
foreach ( int i in primePow)
{
sum += i;
}
sum += k - n;
}
else
{
int []arr = new int [k];
for ( int l = 0; l < arr.Length; l++)
arr[l] = 1;
sum = getMinSum(0, arr, primePow);
}
return sum;
}
public static void Main(String[] args)
{
int k = 3, x = 210;
Console.Write(minimumSumWithGivenLCM(k, x));
}
}
|
Javascript
<script>
function primePower(X)
{
let primePow = [];
for (let i = 2; i * i <= X; i++) {
if (X % i == 0) {
let p = 1;
while (X % i == 0) {
X /= i;
p *= i;
}
primePow.push(p);
}
}
if (X > 1) {
primePow.push(X);
}
return primePow;
}
function getSum(ar)
{
let sum = 0;
for (let i=0;i< ar.length;i++) {
sum += ar[i];
}
return sum;
}
function getMinSum(pos,arr,primePow)
{
if (pos == primePow.length) {
return getSum(arr);
}
let res = Number.MAX_VALUE;
for (let i = 0; i < arr.length;
i++) {
arr[i] *= primePow[pos];
res = Math.min(res, getMinSum(pos + 1,
arr, primePow));
arr[i] /= primePow[pos];
}
return res;
}
function minimumSumWithGivenLCM(k,x)
{
let primePow = primePower(x);
let n = primePow.length;
let sum = 0;
if (n <= k) {
for (let i=0;i< primePow.length;i++) {
sum += primePow[i];
}
sum += k - n;
}
else {
let arr = new Array(k);
for (let i=0;i<k;i++)
{
arr[i]=1;
}
sum = getMinSum(0, arr, primePow);
}
return sum;
}
let k = 3, x = 210;
document.write(minimumSumWithGivenLCM(k, x));
</script>
|
Time Complexity: O(sqrt(X) + 3Y), where Y is the maximum count of prime factors
Auxiliary Space: O(K + Y)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
08 Jul, 2022
Like Article
Save Article