链接:https://ac.nowcoder.com/acm/contest/9981/I
来源:牛客网

输入一个数 ,请构造一个长度为n的排列,使得其中正好有k对相邻的数gcd(最大公约数)大于1。
排列是指1到n一共n个数,每个数都出现过且仅出现过1次。例如{1,3,2,5,4}是一个排列,而{1,3,2,4,5,3},{1,2,4}则不是排列
输入描述:
两个整数n和k,用空格隔开。
n(2 1e5),k(0~n/2);
输出描述:
如果不存在可行的构造方案,输出-1。
否则输出一行n个数,用空格隔开。如果有多组可行的构造方案,输出任意一组即可。<

#include <bits/stdc++.h>
using namespace std;

int main (){
    int n , k;
    cin >> n >> k ;
    if(k < n/2){//n/2个偶数,最多可组成n/2-1个偶数对,可直接输出
        int i = 2;
        while(k--){
            cout<<i<<" ";
            i+=2;
        }
        int j =i;
        for(;i <= n;i++){
            cout<<i <<" ";
        }
        for(int i = 1;i < j;i+=2){
            cout<<i <<" ";
        }
    }
    else {
        if(n < 6){//如果n < 6 组不成n/2个不互素对
            cout<< -1 <<endl;
        }
        else {
            for(int i = 2; i <=n ; i+=2){
                if(i != 6)
                cout<<i<<" ";
            }
            cout<<6 << " "<<3<<" "<<1<<" ";
            for(int i=5; i <= n; i+=2){
                cout<<i<<" ";
            }
        }
    }
    return 0;
}

提示最多不互素对
由偶数把质数的倍数相连