(简单构造题)
题意:让你构造一个序列,使得对于所有 1<=i<=j<=n 而言的这些 gcd(ai,aa+1,...aj) 都在题目给定的输入数字中。
思路:由于所有
gcd()
的组合都给定了,那么对于
i=j
的这些
gcd
就肯定为序列中的数字之一,所以构造序列中肯定包含题目中给定的部分数字。然后大胆想,直接让构造序列包含题目中给定的所有数字可以吗,答案是可以的,只需要在题目给出的数字基础上,令相邻两个数字之间插入一个
gcd(a1,a2,...an)
即可。于是构造序列长度为
2∗n−1
。
(做题的时候脑残了,大胆以为只要包括所有数字就行了,仔细想想还是自己太自信了…自己还没出几组数据就敢提交代码..)
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int a[1010];
int main() {
//freopen("test.txt","r",stdin);
int n; bool flag = 1;
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d",&a[i]);
if(i && a[i]%a[0] != 0)
flag = 0;
}
if(flag) {
printf("%d\n",2*n);
for(int i=0; i<n; i++)
printf("%d %d%c",a[i],a[0],i==n?'\n':' ');
}
else
puts("-1");
return 0;
}