题目翻译
定义一个数是美丽的,当且仅当它能整除自身的每个非零数位。
例如 $250$ 是美丽的,$2333$ 就是不美丽的。
询问 $[L,R]$ 中有多少个数是美丽的。
$1≤L≤R≤9 \times 10^{18}$
题解
考虑到 $1~9$ 的$LCM$只是$2520$,所以一个数的所有非零数位的$LCM$一定是$2520$的因数。
我们设当前状态为$f[i][j][k]$。
表示当前转移到了第$i$位,当前所有非零数位的$LCM$为$j$,当前这个数$%2520 = k$。
枚举当前位$x$。
那些状态可以转移到当前状态呢?
f[i-1][LCM(j,x)][(k*10+x)%2520]
因为$2520$的因数只有$48$个,所以把$lcm$这维优化成$48$这样空间就够了。
小结
数位dp代码的三种实现方式
1、预处理
预处理出所有的状态,然后枚举数位进行转移,转移时判断限制条件
优点:对于多组询问特别好用
缺点:对于有些题目可能很麻烦,甚至不能预处理
2、迭代
对于每次询问单独dp,记录限制条件
优点:代码好写(不用于处理,直接写一个dp就成)
缺点:多组询问没法处理
3、记忆化搜索
对于每一次询问DFS,如果这一位没有受到任何限制就记忆化
优点:代码更好写,且对于多组询问相对友好
缺点:如果位数特别大(什么1e5,1e6之类的),则效果可能不太好
所以以后做数位dp题目时,我首选第三种
比如说这道题:
|
|