/**
题意: 现在有一个集合S有n个元素 S集合是由T集合变来的
T -> S 有以下转化规则 将 T 集合中 所有的 1<= i <= j <=n; [i,j]的子集做一个GCD运算放到另一个集合S中
于是得到了集合S
现在给你S集合让你构造一个T集合
fst特判 S 集合中最小的元素 一定 是(S集合所有元素的GCD)也是(T集合所有元素的GCD)
不满足这个条件就不存在 输出 -1;
如果相同,就构造这么一个T集合
在原来的输入中每间隔插入最小的数,那么单点gcd可以取到每个输入值,区间gcd都是最小值
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 4000;
int num[maxn];
int main()
{
int m;
while(~scanf("%d",&m))
{
for(int i=1;i<=m;i++) scanf("%d",&num[i]);
int gcd = num[1];
for(int i=2;i<=m;i++) gcd = __gcd(gcd,num[i]);
if(gcd != num[1]) puts("-1");
else
{
printf("%d\n",2*m-1);
for(int i=1;i<=m;i++) {
if(i == m) printf("%d\n",num[i]);
else printf("%d %d ",num[i],num[1]);
}
}
}
return 0;
}
CodeForces - 894C-Marco and GCD Sequence
最新推荐文章于 2022-07-13 19:33:26 发布