K Co-prime Permutation(2020icpc南京站)
题目描述
输入描述
输出描述
示例
思路&&感想
2020南京站是本人参加的第一场区域赛,不出意外的打铁了
这道题其实并不难,还是在20min左右gyx想起来的思路,只要相邻的两个数相互交换就得到了两个与原顺序最大公约数为1 的数
对于k为奇数时,仅需要从第二个数开始两两交换(k-1)/2次就好了
对于k为偶数时,先把第一个数和最后一个数交换,之后重复奇数时的操作就可以了
AC代码
#include<bits/stdc++.h> const int N=1e6+10; int a[N]; int main() { int n,k; scanf("%d%d",&n,&k); if(k==0) { printf("-1\n"); return 0; } for(int i=1;i<=n;i++) a[i]=i; int num=0; if(k%2==1) { for(int i=2;num<(k-1)/2;i+=2,num++) { int k=a[i]; a[i]=a[i+1]; a[i+1]=k; } } else { int x=a[1]; a[1]=a[n]; a[n]=x; for(int i=2;num<(k-1)/2;i+=2,num++) { int k=a[i]; a[i]=a[i+1]; a[i+1]=k; } } for(int i=1;i<n;i++) printf("%d ",a[i]); printf("%d",a[n]); return 0; }