做这个题的时候 刚开始一看这不就是全排列吗 dfs遍历判断不就可以了吧 一看数据范围 算了
看数据范围的时候看到了一个条件0 k
n/2
最大条件是偶数的个数
又觉得每两个偶数的gcd都是大于1的
而每个相邻的奇数的gcd都是1 是互素的
所以我们可不可以把偶数都排到一起 排够k+1个偶数就可以凑够k对
然后再把剩下的数字按顺序排下来 这样剩下的偶数中间都会有奇数隔开 一定是互素的
可是问题又来了 k=n/2的时候好像不够啊偶数 偶数只有(n/2)个,可是我们需要(n/2)+1个,那我们能不能把一个奇数放在一个偶数旁边呢,后来发现最小的就是3 6的gdc大于1,我们就把3放在开头 6在它后面 然后后面的数还是按这种方法排就好啦。
import java.util.*;
import java.math.*;
public class Main {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int k = input.nextInt();
int a[] = new int[n];
if(k==n/2)
{
if(n>=6)
{
a[0] = 3;
a[1] = 6;
int l=2;
for(int i=1;i<k;i++)
{
if(l*i>=6)
a[i+1] = l*i+2;
else
a[i+1] = l*i;
}
int r=1;
for(int i=0;i<n-k-1;i++)
{
if(l*i+1<3)
a[i+k+1] = l*i+1;
else{
a[i+k+1] = l*i+3;
}
}
for (int i = 0; i < n; i++) {
System.out.print(a[i]+" ");
}
}
else {
System.out.println(-1);
}
}
else
{
int l=2;
boolean visit[] = new boolean[n+1];
for(int i=0;i<k+1;i++)
{
a[i] = l*(i+1);
visit[l*(i+1)] = true;
}
int p = k+1;
for(int i=1;i<n+1;i++)
{
if(!visit[i])
a[p++] = i;
}
for (int i = 0; i < n; i++) {
System.out.print(a[i]+" ");
}
}
}
}
京公网安备 11010502036488号