题解
易得(a)中的元素均在(s)中存在,但倘若原样照搬会产生其他的(gcd)值,因此需要删去或增添些元素。因为删除元素影响的(gcd)值也许不止当前观测的一个,题解作者并未想到删除元素的算法,便尝试增添元素。推导可知,设(a)序列最小值为(mina),若存在(a_i)满足(a_i\% mina ot=0)则一定无法构造。证明如下:(∵gcd(mina,a_i)<minaquad ∴a)数组中不存在(gcd(mina,a_i)),矛盾。若将(a_i)删除则一定存在(a_j=xa_i,a_k=ya_i)且(x,y)互质,因此(x,y)中必有一个无法被(frac{a_i}{gcd(a_i,mina)})整除,这意味着(a_j,a_k)中一定存在一个无法被(mina)整除,也就是(gcd(mina,a_j或a_k)<mina)。现在我们知道了(a)中所有元素均被(mina)整除,因为题目所取为子串(gcd)(而非子序列),只要用(mina)将所有元素间隔开((a_1,mina,a_2,mina,...,mina,a_n))就可以控制(gcd)为(s)中元素了。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int s[N];
int main()
{
int m,mins=0x3f3f3f3f;
scanf("%d",&m);
for(int i=1;i<=m;i++) {scanf("%d",&s[i]); mins=min(mins,s[i]);}
for(int i=1;i<=m;i++)
if(s[i]%mins) {printf("-1"); return 0;}
printf("%d
",2*m);
for(int i=1;i<=m;i++) printf("%d %d ",mins,s[i]);
return 0;
}