ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-06-11 21:52:47  阅读:333  来源: 互联网

标签:3x Divide int ll 个数 Codeforces three 依次 得到


传送门

 

D. Divide by three, multiply by two

•题意

  给你一个数 x,x 可以执行以下两种操作中的一种得到数 y:

  

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

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

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

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

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

  输出这 n 个数;

•题解

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

    ①3x除以3

    ②x/2乘2

  你会发现,3x 与 x/2 不会同时出现,因为如果同时出现,为什么呢?

  假设 3x 经过 i 次乘2操作,j次除以3的操作得到 x/2,即

  

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

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

  并且这 n 个数各不相同;

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

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=100+50;
 5 
 6 int n;
 7 ll a[maxn];
 8 map<ll ,bool>f;
 9 
10 void Solve()
11 {
12     ll x=a[1];
13     while(true)///找到x
14     {
15         if(f.count(x*3))
16             x *= 3;
17         else if(!(x&1) && f.count(x/2))
18             x /= 2;
19         else
20             break;
21     }
22     printf("%lld",x);///由x开始依次向后推
23     for(int i=2;i <= n;++i)
24     {
25         if(f.count(x*2))
26             x *= 2;
27         else
28             x /= 3;
29         printf(" %lld",x);
30     }
31     printf("\n");
32 }
33 int main()
34 {
35     scanf("%d",&n);
36     for(int i=1;i <= n;++i)
37     {
38         scanf("%lld",a+i);
39         f[a[i]]=true;
40     }
41     Solve();
42 
43     return 0;
44 }
View Code

 

标签:3x,Divide,int,ll,个数,Codeforces,three,依次,得到
来源: https://www.cnblogs.com/violet-acmer/p/11006251.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有