[SGU 108]Self-numbers II(筛法活用优化+滚动数组)

【题目大意】:

定义一个数为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个点…………)

 

【代码】:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值