解题思路

这道题可以使用字典树的方法来解,这里用所构建的字典树来举一个例子:
图片说明
思路就是每一次统计当前节点的子节点的个数,如果是大于等于的,则答案就在当前节点的子树中,如果是小于的,那说明当前答案一定不在这个子树中,就继续去看下一个子树。


如何统计一棵子树中的节点个数呢,直接说的话会有些抽象,这里用一个数字来举例,例如当数字为时,的限制为,则该子树中的节点个数是这样统计的,首先的子节点有,然后继续向下扩展的话是没有的,所以节点对应的子节点个数为,以此类推节点和节点一直到节点的子节点个数都为,我们可以发现,对于一棵节点的子节点为该类节点的个数乘以

参考代码

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))