Generate longest possible array with product K such that each array element is divisible by its previous adjacent element
Last Updated :
04 Jan, 2023
Given an integer K, the task is to construct an array of maximum length with product of all array elements equal to K, such that each array element except the first one is divisible by its previous adjacent element.
Note: Every array element in the generated array must be greater than 1.
Examples:
Input: K = 4
Output: {2, 2}
Explanation:
The second element, i.e. arr[1] (= 2) is divisible by the first element, i.e. arr[0] (= 2).
Product of the array elements = 2 * 2 = 4(= K).
Therefore, the array satisfies the required condition.
Input: K = 23
Output: {23}
Approach: The idea to solve this problem is to find all the prime factors of K with their respective powers such that:
prime_factor[1]x * prime_factor[2]y … * primefactor[i]z = K
Follow the steps below to solve this problem:
- Find the prime factor, say X, with the greatest power, say Y.
- Then, Y will be the length of the required array.
- Therefore, construct an array of length Y with all elements in it equal to X.
- To make the product of array equal to K, multiply the last element by K / X y.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findLongestArray( int K)
{
vector<pair< int , int > > primefactors;
int K_temp = K;
for ( int i = 2; i * i <= K; i++) {
int count = 0;
while (K_temp % i == 0) {
K_temp /= i;
count++;
}
if (count > 0)
primefactors.push_back({ count, i });
}
if (K_temp != 1)
primefactors.push_back(
{ 1, K_temp });
sort(primefactors.rbegin(),
primefactors.rend());
vector< int > answer(
primefactors[0].first,
primefactors[0].second);
answer.back() *= K;
for ( int i = 0;
i < primefactors[0].first; i++) {
answer.back() /= primefactors[0].second;
}
cout << "{" ;
for ( int i = 0; i < ( int )answer.size(); i++) {
if (i == answer.size() - 1)
cout << answer[i] << "}" ;
else
cout << answer[i] << ", " ;
}
}
int main()
{
int K = 4;
findLongestArray(K);
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
static void findLongestArray( int K)
{
ArrayList< int []> primefactors = new ArrayList<>();
int K_temp = K;
for ( int i = 2 ; i * i <= K; i++) {
int count = 0 ;
while (K_temp % i == 0 ) {
K_temp /= i;
count++;
}
if (count > 0 )
primefactors.add( new int [] { count, i });
}
if (K_temp != 1 )
primefactors.add( new int [] { 1 , K_temp });
Collections.sort(primefactors, (x, y) -> {
if (x[ 0 ] != y[ 0 ])
return y[ 0 ] - x[ 0 ];
return y[ 1 ] - x[ 1 ];
});
int n = primefactors.get( 0 )[ 0 ];
int val = primefactors.get( 0 )[ 1 ];
int answer[] = new int [n];
Arrays.fill(answer, val);
answer[n - 1 ] *= K;
for ( int i = 0 ; i < n; i++) {
answer[n - 1 ] /= val;
}
System.out.print( "{" );
for ( int i = 0 ; i < answer.length; i++) {
if (i == answer.length - 1 )
System.out.print(answer[i] + "}" );
else
System.out.print(answer[i] + ", " );
}
}
public static void main(String[] args)
{
int K = 4 ;
findLongestArray(K);
}
}
|
Python3
def findLongestArray(K):
primefactors = []
K_temp = K
i = 2
while i * i < = K:
count = 0
while (K_temp % i = = 0 ):
K_temp / / = i
count + = 1
if (count > 0 ):
primefactors.append([count, i])
i + = 1
if (K_temp ! = 1 ):
primefactors.append(
[ 1 , K_temp])
primefactors.sort()
answer = [primefactors[ 0 ][ 0 ],
primefactors[ 0 ][ 1 ]]
answer[ - 1 ] * = K
for i in range (primefactors[ 0 ][ 0 ]):
answer[ - 1 ] / / = primefactors[ 0 ][ 1 ]
print ( "{" , end = "")
for i in range ( len (answer)):
if (i = = len (answer) - 1 ):
print (answer[i], end = "}" )
else :
print (answer[i], end = ", " )
if __name__ = = "__main__" :
K = 4
findLongestArray(K)
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp
{
class Program
{
static void FindLongestArray( int K)
{
List< int []> primefactors = new List< int []>();
int K_temp = K;
for ( int i = 2; i * i <= K; i++)
{
int count = 0;
while (K_temp % i == 0)
{
K_temp /= i;
count++;
}
if (count > 0)
primefactors.Add( new int [] { count, i });
}
if (K_temp != 1)
primefactors.Add( new int [] { 1, K_temp });
primefactors = primefactors.OrderByDescending(x => x[0]).ThenByDescending(y => y[1]).ToList();
int n = primefactors[0][0];
int val = primefactors[0][1];
int [] answer = new int [n];
for ( int i = 0; i < answer.Length; i++)
{
answer[i] = val;
}
answer[n - 1] *= K;
for ( int i = 0; i < n; i++)
{
answer[n - 1] /= val;
}
Console.Write( "{" );
for ( int i = 0; i < answer.Length; i++)
{
if (i == answer.Length - 1)
Console.Write(answer[i] + "}" );
else
Console.Write(answer[i] + ", " );
}
}
static void Main( string [] args)
{
int K = 4;
FindLongestArray(K);
}
}
}
|
Javascript
<script>
function findLongestArray(K)
{
let primefactors = [];
let K_temp = K;
for (let i = 2; i * i <= K; i++) {
let count = 0;
while (K_temp % i == 0) {
K_temp = Math.floor(K_temp/i);
count++;
}
if (count > 0)
primefactors.push([ count, i ]);
}
if (K_temp != 1)
primefactors.push([ 1, K_temp ]);
primefactors.sort( function (x, y) {
if (x[0] != y[0])
return y[0] - x[0];
return y[1] - x[1];
});
let n = primefactors[0][0];
let val = primefactors[0][1];
let answer = new Array(n);
for (let i=0;i<n;i++)
{
answer[i]=val;
}
answer[n - 1] *= K;
for (let i = 0; i < n; i++) {
answer[n - 1] = Math.floor(answer[n - 1]/val);
}
document.write( "{" );
for (let i = 0; i < answer.length; i++) {
if (i == answer.length - 1)
document.write(answer[i] + "}" );
else
document.write(answer[i] + ", " );
}
}
let K = 4;
findLongestArray(K);
</script>
|
Time Complexity: O(√(K) * log(√(K)))
Auxiliary Space: O(√(K))
Share your thoughts in the comments
Please Login to comment...