题目也就是说找出1--n中的第k小value的排列,value的计算方式为相邻两个数的gcd,暴力的话肯定会超时,再仔细想想,第k晓得排列有多种,最小的排列肯定是相邻两个数互质,

每相邻两个数的gcd都等于1,于是,1--n的顺序排列正好满足,我们再找第二小的,我们只要保证排列中一组数的gcd等于2就行了,第三小的一组数gcd等于3,因此只需要一开始输出2k,k,之后再输出顺序的数就好了。AC代码如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    int n,th;
    scanf("%d",&t);
    for(int u=1;u<=t;u++)
    {
        scanf("%d%d",&n,&th);
        printf("Case #%d: %d %d",u,2*th,th);

        for(int i=th-1;i>=1;i--)
        {
            printf(" %d",i);
        }
        for(int i=th+1;i<=n;i++)
        {
            if(i!=2*th)
                printf(" %d",i);
        }
        printf("\n");
    }
}