字典序
解题思路
这道题可以使用字典树的方法来解,这里用所构建的字典树来举一个例子:
思路就是每一次统计当前节点的子节点的个数,如果是大于等于的,则答案就在当前节点的子树中,如果是小于
的,那说明当前答案一定不在这个子树中,就继续去看下一个子树。
如何统计一棵子树中的节点个数呢,直接说的话会有些抽象,这里用一个数字来举例,例如当数字为时,
的限制为
,则该子树中的节点个数是这样统计的,首先
的子节点有
,然后继续向下扩展的话是没有的,所以
节点对应的子节点个数为
,以此类推
节点和
节点一直到
节点的子节点个数都为
,我们可以发现,对于一棵节点的子节点为该类节点的个数乘以
参考代码
def getCntOfSon(pre, n): cnt = 1 p = 10 while True: if pre * p > n: break if pre * p + p - 1 < n: cnt += p # 判断当前节点是否可以扩展一层,一层的节点个数为p else: """ 如果不可以扩展一层,则说明 pre * p <= n <= pre * p + p - 1, 则只需要加上[pre * p, n]之间的数字个数就好了,也就是n - pre * p + 1 """ cnt += n - pre * p + 1 p *= 10 return cnt def solve(n, m): ans = 1 while True: cnt = getCntOfSon(ans, n) if cnt >= m: # 如果m <= 当前子树节点个数,则这个数字就在这个子树中 m -= 1 if m == 0: break ans *= 10 else: # 否则的话换一棵子树 m -= cnt ans += 1 return ans l = input().split(" ") n = int(l[0]) m = int(l[1]) print(solve(n, m))