题目链接: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 }