Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence

来源:互联网 发布:ubuntu apt 安装路径 编辑:程序博客网 时间:2024/06/05 23:01

C. Marco and GCD Sequence
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

In a dream Marco met an elderly man with a pair of black glasses. The man told him the key to immortality and then disappeared with the wind of time.

When he woke up, he only remembered that the key was a sequence of positive integers of some length n, but forgot the exact sequence. Let the elements of the sequence be a1, a2, ..., an. He remembered that he calculated gcd(ai, ai + 1, ..., aj) for every 1 ≤ i ≤ j ≤ n and put it into a set Sgcd here means the greatest common divisor.

Note that even if a number is put into the set S twice or more, it only appears once in the set.

Now Marco gives you the set S and asks you to help him figure out the initial sequence. If there are many solutions, print any of them. It is also possible that there are no sequences that produce the set S, in this case print -1.

Input

The first line contains a single integer m (1 ≤ m ≤ 1000) — the size of the set S.

The second line contains m integers s1, s2, ..., sm (1 ≤ si ≤ 106) — the elements of the set S. It's guaranteed that the elements of the set are given in strictly increasing order, that means s1 < s2 < ... < sm.

Output

If there is no solution, print a single line containing -1.

Otherwise, in the first line print a single integer n denoting the length of the sequence, n should not exceed 4000.

In the second line print n integers a1, a2, ..., an (1 ≤ ai ≤ 106) — the sequence.

We can show that if a solution exists, then there is a solution with n not exceeding 4000 and ai not exceeding 106.

If there are multiple solutions, print any of them.

Examples
input
42 4 6 12
output
34 6 12
input
22 3
output
-1
Note

In the first example 2 = gcd(4, 6), the other elements from the set appear in the sequence, and we can show that there are no values different from 246 and 12 among gcd(ai, ai + 1, ..., aj) for every 1 ≤ i ≤ j ≤ n.




题意:有一个序列,(1<=i<=j<=n)将求得的gcd(ai,ai+1,...,aj)加入集合。求出原始序列。可能多个答案都可以

思路:先说说我被hack的思路。。。就是直接输出来,比如4 6 12 输出序列也是 4 6 12。好像没什么问题,

因为序列的原始元素都会被加入结合,而最小的一定是全部数最大公约数。因为公约数最大也是跟两个数中小的一样

大,否则只能更小,所以最小的就是所有数的最大公约数。

但我这个思路有个缺陷,如果输入序列的某几个数的公约数不在输入序列里面,这个答案就不对了,

比如 1 6 8,6和8可以求出公约数2,怎么能避免相邻数又生出新的公约数呢?就要插入某个数打断这种可能,

让这个序列求出的所有最大公约数不会超出原始序列构成的集合,那就用最小的也就是所有数的最大公约数,

插入到相邻数的间隔里面去。这样长度也就是翻倍,并不会超出要求范围。

答案需要提前判断下,如果所有输入数的最大公约数不是这些数里面的最小值,则不存在答案。


#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int, int> pii;#define INF 0x3f3f3f3f#define FI first#define SE secondint mod = 1000000007;const int N = 10010;int rec[N];int main() {    int n;    while (~scanf("%d", &n))    {        int ret;        for (int i = 0; i < n; i++)        {            scanf("%d", rec + i);            if (i == 0)                ret = rec[0];            else                ret = __gcd(ret, rec[i]);        }        if (ret != rec[0])            puts("-1");        else        {            printf("%d\n", (n<<1)-1);            printf("%d", rec[0]);            for (int i = 1; i < n; i++)                printf(" %d %d", rec[i], rec[0]);            puts("");        }    }       return 0;}




原创粉丝点击