除以三,乘以二
Posted lipu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除以三,乘以二相关的知识,希望对你有一定的参考价值。
泰泰学长喜欢玩数字(不知道什么奇怪的癖好)。他在黑板上写下一个数字 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
Note
第一个样例中的可能顺序为:[9, 3, 6, 12, 4, 8]。此时开始的 x=9
AC代码1:
#include<cstdio> #include <map> #include<iostream> #include<string> #include<cstring> #include<cmath> #include<algorithm> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!=‘-‘&&(c<‘0‘||c>‘9‘))c=getchar();if(c==‘-‘)f=-1,c=getchar();while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();return f*x;} typedef long long ll; const int maxn=1000; ll a[maxn]; ll b[maxn]; map<ll,int>mp; int main() { ll n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; mp[a[i]]=1; } ll ans; int j; for(int i=0;i<n;i++){ b[0]=a[i]; ans=a[i]; for(j=1;j<n;j++){ if(mp[ans/3]==1&&ans%3==0){ b[j]=ans/3; mp[ans/3]=0; ans/=3; } else if(mp[ans*2]==1){ b[j]=ans*2; mp[ans*2]=0; ans*=2; } else{ break; } } if(j==n){ for(int k=0;k<n;k++){ printf("%lld ",b[k]); } } else{ for(int k=0;k<n;k++){ mp[a[k]]=1; } } } }
AC代码2(dfs):
#include<cstdio> #include <map> #include<iostream> #include<string> #include<cstring> #include<cmath> #include<algorithm> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!=‘-‘&&(c<‘0‘||c>‘9‘))c=getchar();if(c==‘-‘)f=-1,c=getchar();while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();return f*x;} typedef long long ll; const int maxn=1000; map<ll,int>mp; ll a[maxn]; ll b[maxn]; int flag=0; int n; void dfs(ll x,int p){ if(flag){ return ; } if(p==n){ flag=1; return ; } if(x%3==0&&mp[x/3]==1){ b[p]=x/3; mp[x/3]=0; dfs(x/3,p+1); mp[x/3]=1; } else if(mp[x*2]==1){ b[p]=x*2; mp[x*2]=0; dfs(x*2,p+1); mp[x*2]=1; } } int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; mp[a[i]]=1; } for(int i=0;i<n;i++){ b[0]=a[i]; dfs(a[i],1); if(flag){ for(int j=0;j<n;j++){ printf("%lld ",b[j]); } break; } } return 0; }
以上是关于除以三,乘以二的主要内容,如果未能解决你的问题,请参考以下文章