此题主要思路是dp,但dp有多种写法。
我们用f[i][j]表示现在已经有i个数字了,而且最后j个数字是不幸数字前j个数字。(保证不包含不吉利序列)
为了防止dp的意义出现歧义,我们让对于同一个状态j要竟可能大;
比如 1212是不幸数字,那么551212是f[6][4];
这样的话我们可以发现f[0][0]=1;
ans=f[n][k] ,k∈[0,m-1] ∪Z(若k=m,那么已经形成一个不吉利序列)
这样的话我们可以从f[0][0]地推;
每局这个状态最后放一个什么数字,然后kmp求j
a[j][k]表示j个不幸之后放k产生的新的j
a[j][k]这个可以用kmp解决
这样可以得到转移方程f[i+1][a[j][k]]=(f[i+1][a[j][k]]+f[i][j])%mo;
意为已经知道f[i][j],最后j个是不吉利数字的前j个,加上一个数字k,最多形成不吉利序列的前a[j][k]个,所以可以通过f[i][j]的状态转移到f[i+1][a[j][k]]的状态。
此题满分需要用矩阵优化dp,但修改以后占比很小,此处不讲,想学习的同学可以上网查题解。
下面是网上使用范围更多的一种转移方程(但没有标程)。
设f[i][j]表示内容同上
f[i][j]的准确含义: f[i][j]表示的每种方案都不含长度大于j且与不吉利数的前缀相同 的后缀 (同上)
否则就会出现:从1到m标号,不吉利数为123124时,f[i][2]