Polycarp喜欢玩数字。 他取一些整数x,写在黑板上,然后执行两种运算:
将数字x除以3(x必须可以被3整除);
将数字x乘以2。
你的问题是重新排序这个序列的元素,使得它可以匹配上述规则。即 每个下一个数字将是前一个数字的两倍,或者是前一个数字的三分之一。
保证答案的存在。
Input
输入的第一行包含整数n(2≤n≤100) - 序列中元素的数量。 输入的第二行包含n个整数a1,a2,…,an(1≤ai≤3⋅1018)
Output
输出n个整数 - 重新排列后的序列,可以是原序列。
保证答案的存在。
Sample Input
Input
6
4 8 6 3 12 9
Output
9 3 6 12 4 8
Input
4
42 28 84 126
Output
126 42 84 28
Input
2
1000000000000000000 3000000000000000000
Output
3000000000000000000 1000000000000000000
/*
DFS 递归
先判断一个数是否满足两个条件
1、该数的 2 倍是否在该输入集合中( 这里用 vis 等于1 来标记在该集合中)
2、该数 除 3 是否在该集合中
如果不符合上诉条件的话,则递归 return 0 到上一级,并且让 k 减减,知道重新开始
*/
/*由于数比较大,3*10^8 ,则开 long long
第三组样例中,超过了 int ,则 用 map 开一个 long long 型的标记数组
需要包括头文件 #include<map>
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long LL;
long long k=0,flag=0,n;
long long ans[101];
map<LL,int>vis;
long long DFS(long long int a)
{
if(k==n-1){
ans[k++]=a;
return 1;
}
if(vis[a*2]==1){
ans[k++]=a;
if(DFS(a*2))
return 1;
k--;
}
if(a%3==0&&vis[a/3]==1){
ans[k++]=a;
if(DFS(a/3))
return 1;
k--;
}
return 0;
}
int main()
{
long long i;
long long c[101];
scanf("%lld",&n);
for(i=0;i<n;i++){
scanf("%lld",&c[i]);
vis[c[i]]=1;
}
for(i=0;i<n;i++){
k=0;
flag=0;
flag=DFS(c[i]);
if(flag==1)
break;
}
for(i=0;i<n;i++){
if(i==0)
printf("%lld",ans[i]);
else
printf("% lld",ans[i]);
}
printf("\n");
}