【题目大意】:
定义一个数为self-number x,当且仅当找不到一个n使得x=d(n)。定义d(n)为n+(n的各位数之和)。给出一个n,求小于n的self-number个数,并且给出k个询问,每个询问为这个范围内第Sk个self-number。
【题目分析】:
首先要想一想这个题的特性。
self-number是一串非self-number派生的根源,所以我们想到了素数的筛法。但是我们注意到这样一点,那就是这道题的空间限制卡得太严了~
10^7的布尔数组完全无法承受,所以我们就要考虑如何精简空间的问题。
我们发现,两个相派生的数之间的差距不会超过63(7*9)。所以可以使用滚动数组~数组只要开到64就足够了……
对于询问进行排序,然后在筛出self-number的过程中进行回答。
还有一个小优化,就是说一个数可以被断成两截,预处理出0~9999的各位数之和,这样得到d(n)只需要O(1)的复杂度了~
P.s. 最开始犯了一个极其缺心眼的错误,因为很晚了,神智不太清醒,快排的递归部分没写~结果WA on 6(这种情况居然~~还能过5个点…………)
【代码】: