[省选] [数位DP] [HLOI2016] 幸运数字

题目描述 Description

小明是个非常喜欢幸运数字的同学,他认为自己的幸运数字是7。同时他非常喜欢偶数,所以他认为如果7出现在某一个整数的所有的左起(从1开始计数)偶数位上,那这个整数就是他的幸运数。
这天,小刚想要考小明一个问题,他说给小明一个区间 [l,r] ,问这个区间里能够整除 m 的幸运数有多少个。

输入 Input

输入文件的第一行是一个整数 m ,第二行是两个整数 l r ,代表询问的区间。

输出 Output

输出文件中仅包含一个数字,即对应输入文件的答案。由于答案可能比较多,输出答案应对 109+7 取余。

样例输入 Sample Input

3
10 99

样例输出 Sample Output

3

样例解释 Explanation

10到99之间有27、57、87可以整除3,并且是幸运数字。

限制 Limits

对于30%的数据: 1l<r106
对于100%的数据: 1m2000,1l<r102000
数据保证 l r 的位数一致并没有前导0。
Time Limit : 1s & Memory Limit : 128MB

HLOI2016全AC达成
l r 太大了,典型数位DP题。
于是这就成为本蒟蒻第一道数位DP……
两个 dp 数组,用 dpL(R)[i][j][0/1/2] 表示 [1,L(R)] 中,前 i 位组成的数余数为 j ,且组成的数大于/等于/小于左或右区间的数。
每次加入一位数,比前 i1 位大的转移到比前 i 位大,小的同理。相等的可以自行意会……
初值就是把 1 -> 9 扫一遍,加到 dp 数组里。
答案是 dpR[n][0][2]+dpR[n][0][1]dpL[n][0][2]
具体转移和答案参见代码。
题解说了跟没说一样。
然后不知为何貌似数据错了?
省选题数据会错?
如果哪位神犇看出了错误请留言或给[email protected]发个邮件什么的。
平均来算,时间复杂度应该为 O(112mn) n 为数字位数。
Code

你可能感兴趣的:(省选,DP)