gcd
\gcd
gcd 运算是越 “
gcd
\gcd
gcd” 越小,单个数自己和自己
gcd
\gcd
gcd 就是最大的,所以排序后,原序列中的数都排在最前面
{
60
,
30
,
.
.
.
2
}
\{ 60,30,...2 \}
{60,30,...2} 这样就假了,但是最大的数肯定是原序列中的数。同理的,最小的数,那肯定是原序列中所有数的
gcd
\gcd
gcd
gcd
\gcd
gcd 运算的结果,只看参与运算的有哪些不同的数,所以把题目中给的
s
e
t
set
set 中所有数(
gcd
\gcd
gcd 的值 )再求一个
gcd
\gcd
gcd,实质上还是对原序列中所有数求
gcd
\gcd
gcd,结果就应该是
s
e
t
set
set 的最小值。如果不是,无解。
那如果我在
s
e
t
set
set 中每两个相邻的数之间插一个最小值,得到一个数组
a
r
r
arr
arr,该数组所有长度为一的子串的
gcd
\gcd
gcd 对应所有
s
e
t
set
set 中的值,而长度大于等于
2
2
2 的子串,
gcd
\gcd
gcd 都是
s
e
t
set
set 中的最小值。
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",a+i);
int Min = *min_element(a,a+n);
int g = a[0];
for(int i=1;i<n;i++) g = __gcd(g,a[i]);
if( g != Min ) {
printf("-1");
}
else {
printf("%d\n",2*n);
for(int i=0;i<n;i++){
// if( i > 0 ) printf("%d ",Min);
printf("%d %d ",a[i],Min);
}
}
printf("\n");
}