Divide by three, multiply by two
泰泰学长喜欢玩数字(不知道什么奇怪的癖好)。他在黑板上写下一个数字 x ,然后进行 n-1 次以下两种操作:
x 除以3 (必须能整除才能进行,即 x mod 3=0)
x 乘以2
每次操作完成后,泰泰学长在黑板上写上这个操作后的新数字,并让这个新数字作为新的 x 继续下一次操作。最后黑板上有 n 个数字。
由于泰泰学长是随机在黑板上的位置写数字的,所以他最后忘记了顺序。现在泰泰学长只知道所有的数字,你能帮助泰泰学长找出一种可能的序列吗?
保证答案一定存在。
Input
第一行是数字总数 n (2 ≤ n ≤ 100)。第二行包含 n 个数字a1,a2,…,an (1 ≤ ai ≤3×10^18),注意是不按顺序的。
Output
输出 n 个数字,按照泰泰学长写数字的顺序排列。
保证答案一定存在。
Examples
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
本是cf的一道题
这是原题链接CF原题地址
附上大佬博客玄妙思路
这道题呢,请教了同学后,自己还是没写出来,最后在博客上找到了个非常棒的博文,我个人不喜欢看很长很长的那种代码,所以这次的这个很合胃口,但仍是不太理解为什么这样可以呢,还请大家帮忙指点一下
抄袭的代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll get_3(ll x)
{
int cnt=0;
while((x%3==0))
{
cnt++;
x/=3;
}
return cnt;
}
bool cmp(ll x,ll y)
{
ll p=get_3(x),q=get_3(y);
if(p==q)
return x<y;
else
return p>q;
}
int main()
{
ll n,i,a[200];
scanf("%lld",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
sort(a,a+n,cmp);
for(i=0;i<n;i++)
printf("%lld ",a[i]);
return 0;
}