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 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
原文地址:https://www.cnblogs.com/Blogggggg/p/7875886.html