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;
}

 

posted @ 2020-12-20 19:37  TheWeak  阅读(79)  评论(0编辑  收藏  举报