做这个题的时候 刚开始一看这不就是全排列吗 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]+" "); } } } }