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\n",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("\n");
20     }
21     else
22         printf("-1\n");
23     return 0;
24 }

 

posted @ 2017-11-21 23:32  Blogggggg  阅读(389)  评论(0编辑  收藏  举报