zoukankan      html  css  js  c++  java
  • CF1059C Sequence Transformation

    原题链接

    题目大意

    读入一个正整数(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} ight floor$的排列。于是我们就迭代地重复以上操作。边界为$3$,考虑此时会先去掉第一、二个数,第三个输出应为最后一个数本身,要特判。 AC代码如下: ```cpp #include

    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;
    }

  • 相关阅读:
    初级算法-1.从排序数组中删除重复项
    一个字符串匹配函数...
    Working With JSON
    javascript iterator
    js 正则表达式验证密码、邮箱格式.....
    SpringMVC 定时任务
    JS 数组去重
    JAVA 跨域请求 不用JSONP 不用CORS
    openLayer 跳到指定坐标
    清空CheckBox 勾选
  • 原文地址:https://www.cnblogs.com/dummyummy/p/9756417.html
Copyright © 2011-2022 走看看