题目链接
题意:定义和谐数为所有相邻数的gcd的和,现在给你一个1到n的序列,在n!个全排列中找出第k大的和谐数
题解:
比如说n = 6
首先最小的和谐数当然直接就是1到6了,当然也可能有其他的解,但这个题是多解的special judge,1到6当然可以,第二大呢,发现可以写出2 4 1 3 5 6,在最小的基础上只增加了1,第三大可以这样3 6 1 4 5 2在最小的基础上增加了2,对于第k大,能不能摆成这样一个数列k,2*k在一起,替他的gcd分别都是1,这样的话肯定是第k大了(题目还说明了2*k <=n,简直是暗示啊),然后一通瞎搞乱排,发现这么一个排列方法
对于1,2,3,4,5,6,7……n的排列
他的第k大是这样的
k+1,k+2…k+k-1,1,2,3……k-1,k,2*k,2*k+1,2*k+2……n
就是先取出k和k+k,然后把k到2k中间的数连续放到最左边,然后放1到k,2*k的右边放2*k加1到n,显然除开k和2k的gcd为k,其他的分别都为1,是第k大
//AC code 109ms
#include <stdio.h>
int main()
{
int T,cas = 1,n,k,i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d" ,&n,&k);
printf("Case #%d:",cas++);
for(i = k + 1; i < k + k; i++) printf(" %d",i);
for(i = 1; i <= k; i++) printf(" %d",i);
for(i = k + k; i <= n; i++) printf(" %d",i);
printf("\n");
}
return 0;
}