题意:构造一个长度为n的序列(数字不重复),然后每次从前面拿出两个数,使得每次
两个数的gcd和==k.
找出一大堆质数,然后不断的放质数(k-1),一直到最后放k*2和k*2(如果最后k剩下1)
还是放两个质数.然后n是奇数的话还要在最后放一个数.
#include <bits/stdc++.h>
using namespace std;
#define maxn 5111111
int n, k;
vector <int> ans;
int num[maxn], cnt;
int is_prime[maxn];
void init () {
cnt = 0;
memset (is_prime, 1, sizeof is_prime);
for (int i = 2; i < maxn; i++) {
if (is_prime[i]) {
num[cnt++] = i;
for (int j = i+i; j < maxn; j += i) {
is_prime[j] = 0;
}
}
}
}
int main () {
init ();
while (cin >> n >> k) {
if (n == 1) {
cout << (k == 0 ? 1 : -1) << endl;
continue;
}
int cnt = 0;
ans.clear ();
if (k < n/2) {
printf ("-1\n");
continue;
}
int tot = n/2;
for (int i = 1; i < tot; i++) {
ans.push_back (num[cnt++]);
ans.push_back (num[cnt++]);
k--;
}
if (k > 1) {
ans.push_back (k*2);
ans.push_back (k*3);
}
else {
ans.push_back (num[cnt++]);
ans.push_back (num[cnt++]);
}
if (n&1)
ans.push_back (1);
for (int i = 0; i < ans.size (); i++)
cout << ans[i] << (i == ans.size ()-1 ? '\n' : ' ');
}
return 0;
}