题目描述 Description
小明是个非常喜欢幸运数字的同学,他认为自己的幸运数字是7。同时他非常喜欢偶数,所以他认为如果7出现在某一个整数的所有的左起(从1开始计数)偶数位上,那这个整数就是他的幸运数。
这天,小刚想要考小明一个问题,他说给小明一个区间 [ l , r ] [l,r] [l,r],问这个区间里能够整除 m m m的幸运数有多少个。
输入 Input
输入文件的第一行是一个整数 m m m,第二行是两个整数 l l l和 r r r ,代表询问的区间。
输出 Output
输出文件中仅包含一个数字,即对应输入文件的答案。由于答案可能比较多,输出答案应对 1 0 9 + 7 10^9+7 109+7取余。
样例输入 Sample Input
3
10 99
样例输出 Sample Output
3
样例解释 Explanation
10到99之间有27、57、87可以整除3,并且是幸运数字。
限制 Limits
对于30%的数据: 1 ≤ l < r ≤ 1 0 6 1\le l\lt r\le 10^6 1≤l<r≤106
对于100%的数据: 1 ≤ m ≤ 2000 , 1 ≤ l < r ≤ 1 0 2000 1\le m\le 2000,1\le l\lt r\le 10^{2000} 1≤m≤2000,1≤l<r≤102000
数据保证 l l l和 r r r的位数一致并没有前导0。
Time Limit : 1s & Memory Limit : 128MB
HLOI2016全AC达成
l
l
l和
r
r
r太大了,典型数位DP题。
于是这就成为本蒟蒻第一道数位DP…
两个
d
p
dp
dp数组,用
d
p
L
(
R
)
[
i
]
[
j
]
[
0
/
1
/
2
]
dpL(R)[i][j][0/1/2]
dpL(R)[i][j][0/1/2]表示
[
1
,
L
(
R
)
]
[1,L(R)]
[1,L(R)]中,前
i
i
i位组成的数余数为
j
j
j,且组成的数大于/等于/小于左或右区间的数。
每次加入一位数,比前
i
−
1
i-1
i−1位大的转移到比前
i
i
i位大,小的同理。相等的可以自行意会…
初值就是把
1
1
1->
9
9
9扫一遍,加到
d
p
dp
dp数组里。
答案是
d
p
R
[
n
]
[
0
]
[
2
]
+
d
p
R
[
n
]
[
0
]
[
1
]
−
d
p
L
[
n
]
[
0
]
[
2
]
dpR[n][0][2]+dpR[n][0][1]-dpL[n][0][2]
dpR[n][0][2]+dpR[n][0][1]−dpL[n][0][2]
具体转移和答案参见代码。
题解说了跟没说一样。
然后不知为何貌似数据错了?
省选题数据会错?
如果哪位神犇看出了错误请留言或给herano1999@gmail.com发个邮件什么的。
平均来算,时间复杂度应该为
O
(
11
2
m
n
)
O(\frac{11}{2}mn)
O(211mn)。
n
n
n为数字位数。
Code