• CF894C Marco and GCD Sequence


    题目链接:http://codeforces.com/contest/894/problem/C

    题目大意:

      按照严格递增的顺序给出 (m) 个数作为公因数集,请你构造出一个数列,对于数列中的任意连续子段,其公因数都在题目给出公因数集中;如果无法构造出合格的数列则输出 “-1” 。

    知识点:  (void)

    解题思路:

      如果公因数集中最小的数不能整除集合中的所有数,则输出 “-1”,设最小的数是 (x_{1}),其不能整除的数是 (x_{i}) ,很明显你构造出来的数列中一定存在 (gcd(i_{1} , ... , j_{1}) = x_{1},  gcd(i_{2}, ... , j_{2}) = x_{i}),对于 ( i = min(i_{1}, i_{2}), j = max(j_{1}, j_{2})),存在 (gcd(i, ... , j) = gcd(x_{1},x_{i}) < x_{1}) ,这与题目中 (x_{1}) 最小的设定相矛盾。

      如果公因数集中最小的数能整除集合中的所有数,构造一个合法的数列的方法就是:把公因数集照抄过去,然后保证除了 “第一个数” 以外的每一个数的旁边都有一个 “第一个数”。

    AC代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1000+5;
     4 int inp[maxn];
     5 
     6 int main(){
     7     int m;
     8     scanf("%d",&m);
     9     for(int i=0;i<m;i++)    scanf("%d",&inp[i]);
    10     bool can=true;
    11     for(int i=1;i<m;i++){
    12         if(inp[i]%inp[0]!=0)  can=false;
    13     }
    14     if(can){
    15         printf("%d
    ",2*m);
    16         for(int i=0;i<m;i++){
    17             if(i!=0)    printf(" ");
    18             printf("%d %d",inp[0],inp[i]);
    19         }printf("
    ");
    20     }
    21     else
    22         printf("-1
    ");
    23     return 0;
    24 }
    “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
  • 相关阅读:
    第十六章 课程总复习
    第四章 数据类型及数据库基本操作
    第二章.图形化管理工具
    第十三章 指导学习:人机猜拳
    洛谷 P4396 (离散化+莫队+树状数组)
    洛谷 P1351 (枚举)
    洛谷P5322 (BJOI 2019) DP
    P3376 网络最大流模板(Dinic + dfs多路增广优化 + 炸点优化 + 当前弧优化)
    洛谷 P2176(最短路)
    HDU 6556 (2018CCPC吉林 B题)
  • 原文地址:https://www.cnblogs.com/Blogggggg/p/7875886.html
Copyright © 2020-2023  润新知