版权声明:欢迎转载~转载请注明出处! https://blog.csdn.net/riba2534/article/details/82974220
题目链接:C. Sequence Transformation
思路:
给你一个序列,从1到n。然后有一个操作,求出这个序列的数的所有的gcd
,然后把这个数添加到原序列中,然后你可以任意选择删除一个数,直到这个序列为空,序列结束。
题目让你输出,每一次求出的gcd
的值所组成的序列,并且让这序列字典序最大。(保证元素唯一性,比如求出来的gcd的值为1,如果1已经存在那么不用添加)
样例已经给出解释3
。
要使得字典序最大,那么我们就要使得gcd这个序列尽量快一些,那么只要存在奇数,这个序列gcd的值永远是1,我们要使得gcd的值增大为2,就要删除所有的奇数,然后当前gcd就变成了2,那么gcd继续增大为4的时候,就要删除2的倍数,且不是4的倍数。。
每次删除之后,序列中的数就会变成n-(n/2)
个,让n一直除以2,x从1开始一直扩大二倍即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 6;
int main()
{
int n;
scanf("%d", &n);
int x = 1;
while (n)
{
for (int i = 1; i <= n - (n / 2); i++)
{
printf("%d ", x);
}
if (n == 3)
{
printf("%d ", 3 * x);
break;
}
n /= 2, x *= 2;
}
puts("");
return 0;
}