解题思路
这道题可以使用字典树的方法来解,这里用所构建的字典树来举一个例子:
思路就是每一次统计当前节点的子节点的个数,如果是大于等于的,则答案就在当前节点的子树中,如果是小于
的,那说明当前答案一定不在这个子树中,就继续去看下一个子树。
如何统计一棵子树中的节点个数呢,直接说的话会有些抽象,这里用一个数字来举例,例如当数字为时,
的限制为
,则该子树中的节点个数是这样统计的,首先
的子节点有
,然后继续向下扩展的话是没有的,所以
节点对应的子节点个数为
,以此类推
节点和
节点一直到
节点的子节点个数都为
,我们可以发现,对于一棵节点的子节点为该类节点的个数乘以
参考代码
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))
京公网安备 11010502036488号