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 个数各不相同;
那么,任意选取一个数,依次向前推到第一个数,依次向后推即可得到答案;
•代码
View Code#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;
以上是关于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