CF894C Solution

题目链接

题解

易得\(a\)中的元素均在\(s\)中存在,但倘若原样照搬会产生其他的\(gcd\)值,因此需要删去或增添些元素。因为删除元素影响的\(gcd\)值也许不止当前观测的一个,题解作者并未想到删除元素的算法,便尝试增添元素。推导可知,设\(a\)序列最小值为\(mina\),若存在\(a_i\)满足\(a_i\% mina\not=0\)则一定无法构造。证明如下:\(∵gcd(mina,a_i)<mina\quad ∴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\n",2*m);
	for(int i=1;i<=m;i++) printf("%d %d ",mins,s[i]);
	return 0;
}
posted @ 2021-03-22 22:32  violet_holmes  阅读(38)  评论(0编辑  收藏  举报