Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two

Posted mmminoz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two相关的知识,希望对你有一定的参考价值。

传送门

D. Divide by three, multiply by two

•题意

给你一个数 x,有以下两种操作,x 可以任选其中一种操作得到数 y

1.如果x可以被3整除,y=x/3

2.y=x*2

y 再执行上述两种操作的一种得到数 z;

  接着对 z 得到......

  这样依次执行了 n-1 次会得到 n 个数;

  现在给你这 n 个数,让你按照上述规则给这 n 个数排序,使得其满足

  a1=x , a2=y , a3=z , ........

 

•思路

对于任意一个数 p,能通过两类操作得到:

①p=3p /3

②p=x/2 *2

技术图片

因为GCD(2,3) = 1,所以右边的等式是不可能成立的;

  所以 p只能由①②中的一种情况得到;

  并且这 n 个数各不相同;

  那么,任意选取一个数,依次向前推到第一个数,依次向后推即可得到答案;

 

•代码

技术图片
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<ll,int> mp;
int main()

    int n;
    cin>>n;
    ll x;
    for(int i=0;i<n;i++)
    
        cin>>x;
        mp[x]=1;
    
    ll cur=x;
    while(1)
    
        if(cur%2==0&&mp.count(cur/2))
            cur/=2;
        else if(mp.count(cur*3))
            cur*=3;
        else //直到没有前一个 此时为第一个数
            break;
    
    while(1) //从前往后推 乘2 或 除3 
    
        cout<<cur<< ;
        if(mp.count(cur*2))
            cur*=2;
        else if(cur%3==0&&mp.count(cur/3))
            cur/=3;
        else
            break;
    
View Code

 

以上是关于Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #479 (Div. 3)题解

Codeforces Round #479 (Div. 3) 题解

Codeforces Round #479 (Div. 3)解题报告

[CF977X]Codeforces Round #479 (Div. 3)

Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)

Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two