zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    《杜教筛》
    《洛谷P4213 【模板】杜教筛(Sum)》
    《洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB》
    《纸牌问题》
    《洛谷P2522 [HAOI2011]Problem b》
    使用urlretrieve下载图片
    scrapy初探
    爬豆瓣电影名
    直接插入排序
    Windows python 3 安装OpenCV
  • 原文地址:https://www.cnblogs.com/MMMinoz/p/11076212.html
Copyright © 2011-2022 走看看