using
System;
using
System.Collections.Generic;
public
class
GFG {
static
bool
[] Primes =
new
bool
[500002];
static
List<
int
> Factors =
new
List<
int
>();
class
Pair {
public
int
first;
public
int
second;
public
Pair(
int
i,
int
j)
{
first = i;
second = j;
}
}
static
void
SieveOfEratosthenes(
int
n)
{
Primes[0] =
true
;
for
(
int
i = 3; i <= n; i += 2) {
if
(!Primes[i / 2]) {
for
(
int
j = 3 * i; j <= n; j += 2 * i)
Primes[j / 2] =
true
;
}
}
for
(
int
i = 2; i <= 500001; i++) {
if
(!Primes[i])
Factors.Add(i);
}
}
static
int
log_a_to_base_b(
int
a,
int
b)
{
return
(
int
)(Math.Log(a) / Math.Log(b));
}
static
int
HighestPower(
int
N,
int
K)
{
int
start = 0, end = log_a_to_base_b(N, K);
int
ans = 0;
while
(start <= end) {
int
mid = start + (end - start) / 2;
int
temp = (
int
)(Math.Pow(K, mid));
if
(N % temp == 0) {
ans = mid;
start = mid + 1;
}
else
{
end = mid - 1;
}
}
return
ans;
}
static
void
displayHighestOrder(
int
[] arr,
int
N)
{
List<Pair> Nums =
new
List<Pair>();
for
(
int
i = 0; i < N; i++) {
int
temp = 1;
foreach
(
int
Prime
in
Factors)
{
if
(Prime * Prime > arr[i])
break
;
else
if
(arr[i] % Prime == 0)
temp = Math.Max(
temp, HighestPower(arr[i], Prime));
}
Nums.Add(
new
Pair(arr[i], temp));
}
Nums.Sort((a, b) = > b.second - a.second);
for
(
int
i = 0; i < N; i++) {
Console.Write(Nums[i].first +
" "
);
}
Console.WriteLine();
}
static
public
void
Main()
{
SieveOfEratosthenes(500000);
int
[] arr = { 81, 25, 27, 32, 51 };
int
N = arr.Length;
displayHighestOrder(arr, N);
}
}