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

来源:互联网 发布:java se8下载 编辑:程序博客网 时间:2024/06/01 09:37

题目描述 Description

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

输入 Input

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

输出 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
数据保证lr的位数一致并没有前导0。
Time Limit : 1s & Memory Limit : 128MB

HLOI2016全AC达成
lr太大了,典型数位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]
具体转移和答案参见代码。
题解说了跟没说一样。
然后不知为何貌似数据错了?
省选题数据会错?
如果哪位神犇看出了错误请留言或给herano1999@gmail.com发个邮件什么的。
平均来算,时间复杂度应该为O(112mn)n为数字位数。
Code

1 0
原创粉丝点击