Codeforces Round #514 (Div. 2) C. Sequence Transformation(思路,数论)

版权声明:欢迎转载~转载请注明出处! 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;
}

猜你喜欢

转载自blog.csdn.net/riba2534/article/details/82974220