码迷,mamicode.com
首页 > 其他好文 > 详细

CF1059C Sequence Transformation

时间:2018-10-08 20:45:02      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:code   需要   整数   数列   problem   题目   using   bre   href   

原题链接

题目大意

读入一个正整数\(n\)。你有一个长度为\(n\)的排列。对于一次操作,我们需要做一下几步:
1.将目前序列内所有数的\(gcd\)加入答案中
2.将序列内随意删除一个数
3.如果序列为空,则停止操作,否则重复以上步骤操作完毕后,我们将会得到一个答案序列。请输出字典序最大的那一个答案序列

输入输出样例

输入:3
输出:1 1 3

首先,我们有引理:

\(gcd(a, a-1)=1\)

用辗转相除法易证。
所以我们一定要先把所有奇数输出,并输出相应数量的\(1\)。然后我们会得到一个只由偶数构成的数列,此时的\(gcd\)\(2\)。于是我们把\(2\)提出来,就得到一个\(1\)~\(\left \lfloor \frac{n}{2} \right \rfloor\)的排列。于是我们就迭代地重复以上操作。边界为\(3\),考虑此时会先去掉第一、二个数,第三个输出应为最后一个数本身,要特判。
AC代码如下:

#include <bits/stdc++.h>

using namespace std;

int n, g = 1;

int main() {
    cin >> n;
    while(n) {
        if(n == 3) {
            cout << g << " " << g << " " << 3*g << " ";
            break;
        }
        for(int i = 1; i <= n/2+(n%2); ++i) cout << g << " ";
        n /= 2, g *= 2;
    }
    return 0;
}

CF1059C Sequence Transformation

标签:code   需要   整数   数列   problem   题目   using   bre   href   

原文地址:https://www.cnblogs.com/dummyummy/p/9756417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!