CF1059C Sequence Transformation
Posted dummyummy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1059C Sequence Transformation相关的知识,希望对你有一定的参考价值。
题目大意
读入一个正整数(n)。你有一个长度为(n)的排列。对于一次操作,我们需要做一下几步:
1.将目前序列内所有数的(gcd)加入答案中
2.将序列内随意删除一个数
3.如果序列为空,则停止操作,否则重复以上步骤操作完毕后,我们将会得到一个答案序列。请输出字典序最大的那一个答案序列
输入输出样例
输入:3
输出:1 1 3
首先,我们有引理:
用辗转相除法易证。
所以我们一定要先把所有奇数输出,并输出相应数量的(1)。然后我们会得到一个只由偶数构成的数列,此时的(gcd)为(2)。于是我们把(2)提出来,就得到一个(1)~(left lfloor frac{n}{2} ight floor)的排列。于是我们就迭代地重复以上操作。边界为(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的主要内容,如果未能解决你的问题,请参考以下文章
cf487C Prefix Product Sequence