1. 程式人生 > >Divide by three, multiply by two

Divide by three, multiply by two

元素 bre scanf 一個數 \n input out 排列 long long

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枚舉可能的情況(可能性逐漸增高),直至構造出題目要求的序列
#include <iostream>
#include <cstdio>
#include <map>
#define LL long long int
using
namespace std; map<LL,int>mp; LL a[111]; LL ans[111]; int cur,n; int DFS(LL b) { if(cur==n-1) { ans[cur++]=b; return 1; } if(mp[b*2]) { ans[cur++]=b; if(DFS(b*2)) return 1; else cur--; } if( b%3==0 && mp[b/3
]) { ans[cur++]=b; if(DFS(b/3)) return 1; else return 0; } return 0; } int main() { int i; cin>>n; for(i=0;i<n;i++) { scanf("%lld",&a[i]); mp[a[i]]=1; } for(i=0;i<n;i++) { cur=0; if(DFS(a[i]) ) break; } for(i=0;i<n;i++) printf("%lld%c",ans[i],i==n-1?\n: ); return 0; }


Divide by three, multiply by two