题目也就是说找出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");
}
}