链接: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;
}提示最多不互素对
由偶数把质数的倍数相连



京公网安备 11010502036488号