题目描述
现有一个升序排序的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=0∑yCxi
利用这个公式我们从高到低进行确定这位是取 0 0 0 还是 1 1 1</