hdu5916长春区题目-瞎搞构造

题目链接
题意:定义和谐数为所有相邻数的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值