数位过程类题目的一般算法

何为数位过程类题目呢?(我瞎编的名词)
就比如说我和谐社会模拟赛的第一题(其实是SGU390)
跟数位有关。还是一个过程。。(汗一个)
题目一:
http://www.orzoj.org/ 上的father
解决这个题目的话。我们需要对这个题目究竟在干神马丽洁清楚。。
这个题目本质上是一个过程,从l进行到r,直接暴力模拟显然是会TLE的。
因此我们需要寻找一种加速的办法。
首先对于无规律的区间[l,r]显然很难加速。
注意到我们可以把区间[l,r]分解成一堆个数不超过O(LogR)的xxxxxx00000-xxxxxx99999这样的区间。。
同时我们可以发现xxx000-xxx999
可以分成10个更小的区间xxx000-xxx099+xxx100-xxx199….balabala
然后我们就可以考虑这个更加规范化的问题了。。
首先我们需要计算出一个子过程的结果,必须知道神马。。
考虑xxx000-xxx999
如果xxx都要知道,显然就知道的太多了~~
实际显然上xxx有意义的只有它的数位和。。于是需要知道一个prefix_sum。。
同时在前面的过程中,可能给现在的过程留下了一些票的价值。。rest
同时要知道序列的长度,都是10的幂次,用10的多少幂表示。。。pow
那么prefix_sum,rest,pow就可以确定一个状态,
计算一下。。发现空间够的。。
求解这个状态可以枚举从0到9一个个进行下一位。。
为了继续过程的进行,状态需要返回两个结果,一个是过程中的答案cnt,一个是剩下来的票数rest。。
接下就明了了。。自己想吧。。orzoj上面也有标程可以参考。。

题目二: SPOJ 2421. Incrementing The Integer
https://www.spoj.pl/problems/ININT/
这个题目的大意就是给两个数a和b,然后对于a可以让它加上它的一个数位。
比如123可以加上1或2或3
要用最少的次数到达b,同时要求方案数(mod一个大数)
看到这个题目。。。数据范围很大。。没法暴力。。。
运用上面的办法。。。我们考虑xxx000-xxx999这样的区间。。
首先开始的位置不一定是xxx000,也可能是xxx008。。所以需要知道开始位置
结束位置也一样。。从991-999。。。
同时如果我们xxx全都知道,显然知道的太多了~~
仔细一想。。其实只需要知道0-9这10个数位有没有出现过。。
0有没有出现过毫无用处。。。所以只要知道1-9是否出现。。有2^9个状态。。
然后用同样的办法分解成10个自区间。。一个个瞎搞过去。。
就差不多了yeah。。。

8 thoughts on “数位过程类题目的一般算法

  1. 记得很久以前搞OI的时候,这类数位统计题目我都是用记忆化搜索做的,有很多人喜欢递推。。。感觉记忆化搜索比递推好写,而且又快= =||||

Leave a Reply to 溟雨潇潇 Cancel reply

Your email address will not be published. Required fields are marked *