Create a Graph by connecting divisors from N to M and find shortest path
Last Updated :
18 May, 2021
Given two natural numbers N and M, Create a graph using these two natural numbers using relation that a number is connected to its largest factor other than itself. The task is to find the shortest path between these two numbers after creating a graph.
Examples:
Input: N = 6, M = 18
Output: 6 <–> 3 <–> 9 <–> 18
Explanation:
For N = 6, the connection of graph is:
6 — 3 — 1
For N = 18, the connection of graph is:
18 — 9 — 3 — 1
Combining the above two graphs, the shortest path is given by:
6 — 3 — 9 — 18
Input: N = 4, M = 8
Output: 4 <–> 8
Approach: The idea is to find the largest factors of each number other than itself and create a graph by connecting these factors and then find the shortest path between them. Below are the steps:
- Find the largest common factor of M and store it and set it as M.
- Now, until M doesn’t equal to 1 keep repeating the above steps and store the factors generated in an array mfactor[].
- Repeat step 1 and step 2 by taking N as the number and store the factors generated in an array nfactor[].
- Now, traverse both the arrays mfactor[] and mfactor[] and print the shortest path.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
int isprm( int n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 1;
if (n % 2 == 0 || n % 3 == 0)
return 0;
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return 0;
return 1;
}
void shortestpath( int m, int n)
{
vector< int > mfactor, nfactor;
map< int , int > fre;
mfactor.push_back(m);
fre[m] = 1;
while (m != 1) {
if (isprm(m)) {
mfactor.push_back(1);
fre[1] = 1;
m = 1;
}
else {
for ( int i = 2;
i <= sqrt (m); i++) {
if (m % i == 0) {
mfactor.push_back(m / i);
fre[m / i] = 1;
m = (m / i);
break ;
}
}
}
}
nfactor.push_back(n);
while (fre[n] != 1) {
if (isprm(n)) {
nfactor.push_back(1);
n = 1;
}
else {
for ( int i = 2;
i <= sqrt (n); i++) {
if (n % i == 0) {
nfactor.push_back(n / i);
n = (n / i);
break ;
}
}
}
}
for ( int i = 0;
i < mfactor.size(); i++) {
if (mfactor[i] == n)
break ;
cout << mfactor[i]
<< " <--> " ;
}
for ( int i = nfactor.size() - 1;
i >= 0; i--) {
if (i == 0)
cout << nfactor[i];
else
cout << nfactor[i]
<< " <--> " ;
}
}
int main()
{
int m = 18, n = 19;
shortestpath(m, n);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int isprm( int n)
{
if (n <= 1 )
return 0 ;
if (n <= 3 )
return 1 ;
if (n % 2 == 0 || n % 3 == 0 )
return 0 ;
for ( int i = 5 ; i * i <= n; i = i + 6 )
if (n % i == 0 || n % (i + 2 ) == 0 )
return 0 ;
return 1 ;
}
static void shortestpath( int m, int n)
{
Vector<Integer> mfactor = new Vector<>();
Vector<Integer> nfactor = new Vector<>();
HashMap<Integer, Integer> fre = new HashMap<>();
mfactor.add(m);
fre.put(m, 1 );
while (m != 1 )
{
if (isprm(m) != 0 )
{
mfactor.add( 1 );
fre.put( 1 , 1 );
m = 1 ;
}
else
{
for ( int i = 2 ;
i <= Math.sqrt(m); i++)
{
if (m % i == 0 )
{
mfactor.add(m / i);
fre.put(m / i, 1 );
m = (m / i);
break ;
}
}
}
}
nfactor.add(n);
while (fre.containsKey(n) && fre.get(n) != 1 )
{
if (isprm(n) != 0 )
{
nfactor.add( 1 );
n = 1 ;
}
else
{
for ( int i = 2 ;
i <= Math.sqrt(n); i++)
{
if (n % i == 0 )
{
nfactor.add(n / i);
n = (n / i);
break ;
}
}
}
}
for ( int i = 0 ; i < mfactor.size(); i++)
{
if (mfactor.get(i) == n)
break ;
System.out.print(mfactor.get(i) +
" <--> " );
}
for ( int i = nfactor.size() - 1 ;
i >= 0 ; i--)
{
if (i == 0 )
System.out.print(nfactor.get(i));
else
System.out.print(nfactor.get(i) +
" <--> " );
}
}
public static void main(String[] args)
{
int m = 18 , n = 19 ;
shortestpath(m, n);
}
}
|
Python3
import math
def isprm(n):
if (n < = 1 ):
return 0
if (n < = 3 ):
return 1
if (n % 2 = = 0 or n % 3 = = 0 ):
return 0
i = 5
while i * i < = n:
if (n % i = = 0 or n % (i + 2 ) = = 0 ):
return 0
i + = 6
return 1
def shortestpath(m, n):
mfactor = []
nfactor = []
fre = dict .fromkeys( range (n + 1 ), 0 )
mfactor.append(m)
fre[m] = 1
while (m ! = 1 ):
if (isprm(m)):
mfactor.append( 1 )
fre[ 1 ] = 1
m = 1
else :
sqt = ( int )(math.sqrt(m))
for i in range ( 2 , sqt + 1 ):
if (m % i = = 0 ):
mfactor.append(m / / i)
fre[m / / i] = 1
m = (m / / i)
break
nfactor.append(n)
while (fre[n] ! = 1 ):
if (isprm(n)):
nfactor.append( 1 )
n = 1
else :
sqt = ( int )(math.sqrt(n))
for i in range ( 2 , sqt + 1 ):
if (n % i = = 0 ):
nfactor.append(n / / i)
n = (n / / i)
break
for i in range ( len (mfactor)):
if (mfactor[i] = = n):
break
print (mfactor[i], end = " <--> " )
for i in range ( len (nfactor) - 1 , - 1 , - 1 ):
if (i = = 0 ):
print (nfactor[i], end = "")
else :
print (nfactor[i], end = " <--> " )
if __name__ = = "__main__" :
m = 18
n = 19
shortestpath(m, n)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int isprm( int n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 1;
if (n % 2 == 0 || n % 3 == 0)
return 0;
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return 0;
return 1;
}
static void shortestpath( int m, int n)
{
List< int > mfactor = new List< int >();
List< int > nfactor = new List< int >();
Dictionary< int ,
int > fre = new Dictionary< int ,
int >();
mfactor.Add(m);
fre.Add(m, 1);
while (m != 1)
{
if (isprm(m) != 0)
{
mfactor.Add(1);
if (!fre.ContainsKey(1))
fre.Add(1, 1);
m = 1;
}
else
{
for ( int i = 2;
i <= Math.Sqrt(m); i++)
{
if (m % i == 0)
{
mfactor.Add(m / i);
if (!fre.ContainsKey(m/i))
fre.Add(m / i, 1);
m = (m / i);
break ;
}
}
}
}
nfactor.Add(n);
while (fre.ContainsKey(n) && fre[n] != 1)
{
if (isprm(n) != 0)
{
nfactor.Add(1);
n = 1;
}
else
{
for ( int i = 2;
i <= Math.Sqrt(n); i++)
{
if (n % i == 0)
{
nfactor.Add(n / i);
n = (n / i);
break ;
}
}
}
}
for ( int i = 0; i < mfactor.Count; i++)
{
if (mfactor[i] == n)
break ;
Console.Write(mfactor[i] +
" <--> " );
}
for ( int i = nfactor.Count - 1;
i >= 0; i--)
{
if (i == 0)
Console.Write(nfactor[i]);
else
Console.Write(nfactor[i] +
" <--> " );
}
}
public static void Main(String[] args)
{
int m = 18, n = 19;
shortestpath(m, n);
}
}
|
Javascript
function isprm(n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 1;
if (n % 2 == 0 || n % 3 == 0)
return 0;
for (let i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return 0;
return 1;
}
function shortestpath(m, n)
{
let mfactor = new Array()
let nfactor = new Array()
let fre = new Map();
mfactor.push(m);
fre[m] = 1;
while (m != 1) {
if (isprm(m)) {
mfactor.push(1);
fre[1] = 1;
m = 1;
}
else {
for (let i = 2;
i <= Math.sqrt(m); i++) {
if (m % i == 0) {
mfactor.push(m / i);
fre[m / i] = 1;
m = (m / i);
break ;
}
}
}
}
nfactor.push(n);
while (fre[n] != 1) {
if (isprm(n)) {
nfactor.push(1);
n = 1;
}
else {
for (let i = 2;
i <= Math.sqrt(n); i++) {
if (n % i == 0) {
nfactor.push(n / i);
n = (n / i);
break ;
}
}
}
}
for (let i = 0;
i < mfactor.length; i++) {
if (mfactor[i] == n)
break ;
document.write(mfactor[i] + " <--> " );
}
for (let i = nfactor.length - 1;
i >= 0; i--) {
if (i == 0)
document.write(nfactor[i]);
else
document.write(nfactor[i] + " <--> " );
}
}
let m = 18, n = 19;
shortestpath(m, n);
|
Output:
18 <--> 9 <--> 3 <--> 1 <--> 19
Time Complexity: O(log (max(M, N))
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...