• 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 }
    “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
  • 相关阅读:
    网页简单模块布局
    Navicat 8 注册密码
    布局黄冈中学
    php导出csv格式文件
    518. 零钱兑换 II
    1813. 句子相似性 III
    ransac算法概述
    c++ 读取文件夹下所有的文件名
    c++ 获取系统时间 写txt string 转 char* 文件改名 文件删除
    1498. 满足条件的子序列数目 二分 快速幂 等比数列前n项和公式
  • 原文地址:https://www.cnblogs.com/Blogggggg/p/7875886.html
Copyright © 2020-2023  润新知