[SDOI2014]数数 --- AC自动机 + 数位DP

[SDOI2014]数数

题目描述:

我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串。

例如当S=(22,333,0233)时,233是幸运数,2333、20233、3223不是幸运数。

给定N和S,计算不大于N的幸运数个数。

 

输入格式:

输入的第一行包含整数N。

接下来一行一个整数M,表示S中元素的数量。

接下来M行,每行一个数字串,表示S中的一个元素。

 

输出格式:

输出一行一个整数,表示答案模(10^{9}+7)的值。

 

跟[JSOI2007]文本生成器类似

把DP更改为数位DP即可

增添一维 (dp(i,j,k): , k: epsilon (0,1))

k = 0时,表示第 i 位不受限制时的数量

k = 1时,表示第 i 位受到限制时的数量

转移时;

( dp(i, j, 1) = dp(i, j, 1) + dp(i - 1, v, 1) ;)

( dp(i, j, 0) = dp(i, j, 0) + dp(i-1, v, 0) ;)

( dp(i, j, 1) = dp(i, j, 1) + dp(i-1, v, 0),: v leq n;)

初值注意也要限制;

代码在此

原文地址:https://www.cnblogs.com/reverymoon/p/8867393.html