Divide by three, multiply by two

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值