Minimize sum of K positive integers with given LCM
Last Updated :
08 Jul, 2022
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)
Share your thoughts in the comments
Please Login to comment...