01数字排序 题解

题目描述

现有一个升序排序的N位的二进制数。
这些二进制数包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L<=N)的数。
你需要输出的是第i(输入的i确保1<=i<2的N次幂)小的,长度为N,且1的位数的个数小于等于L的那个二进制数,如果还是看不懂的,可以看样例解释。
(比如:001001这样的数字,N=6,含有位数为1的个数为2)。
N<=31

输入

共一行,用空格分开的三个整数N,L,i。

输出

共一行,输出满足条件的第i小的二进制数。

样例输入

5 3 18

样例输出

10010

提示

样例解释:
1 00000
2 00001
3 00010
4 00011
5 00100
6 00101
7 00110
8 00111
9 01000
10 01001
11 01010
12 01011
13 01100
14 01101
15 01110
15 01111 (有四个1,不符条件,pass掉)
16 10000
17 10001
18 10010
19 10011

题目解析

step1:暴力

枚举答案即可。

step:优化

不难得出,在长度为 x x x 出现 y y y 1 1 1 的总数为
f ( x , y ) = ∑ i = 0 y C x i f(x,y)=\sum^y_{i=0}C^i_x f(x,y)=i=0yCxi
利用这个公式我们从高到低进行确定这位是取 0 0 0 还是 1 1 1</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值