给出从1到n的正整数。
通话总和(n)是n的数字总和。
调用STR(n)作为代表数字n的字符串。
按以下顺序排列这些数字: 当且仅当(1)或(2)满足以下条件时,我们x才位于y之前:
- (1) sumdigit (x) <sumdigit (y)
- (2) sumdigit(x)=sumdigit(y) && str(x)<str(y)
例如:
x = 301,y = 221-> x位于y之前(因为总和(x)
x = 201,y = 30-> x位于y之前(因为sumdigit(x)= sumdigit(y)和str(x)
x = 222,y = 213-> y在x之前(因为和数(x)=和数(y)和str(x)> str(y))
给出n <= 10 ^ 18和Q个查询的值
针对上述问题,有两种查询类型:
-在按上述规则排序的范围内找到第k个数字。 (k <= n)
我可以通过使用动态计划dp(n,sum)解决条件(1)的问题:x的数量具有 sumdigit(x)= sum和x <= n >
-> We can count the number of x numbers with sumdigit (x) <sumdigit (k).
The problem I can't solve is the condition (2),
I can't think of a way to count the number of x numbers
with sumdigit(x)=sumdigit(k) and str(x)<str(k)
您能帮我解决条件(2)的问题吗?
我需要你的帮助!
答案 0 :(得分:0)
这里有个提示:
让dp(d,l,s)表示第一个数字= d的数字的数量(d也可以为0),数字的长度<= l和数字的总和= s。
尝试找出递归。您如何使用它来解决问题?