数位DP
什么是数位DP
数位DP是DP的一种,顾名思义,按每一个数位来进行DP。
什么时候使用
题目的要求与一个数字相关,并且它能通过每一个数位来进行转移。
例题:求所有
位数中能被
整除的数的个数。
怎么使用
一般的DP是多维的,首先会有一维表示的是当前到了第几位,通常情况这一维可以使用滚动。
其它的就是根据题目的实际要求了,如例题就需要一维来记录除以
的余数。
以例题为例,我们来讲讲数位DP怎么实现。
状态与转移
我们设
表示当前到了第
位,除以
的余数为
的方案数。
一般是从高位往低位DP,因为最高位不能为
,所以我们对
的情况先处理好:
接着我们用第
位的状态去更新第
位的状态,每次枚举当前在第
位加入
。
想想怎么转移?
对于当前的余数
,在末尾加入了
,余数变成什么?
根据同余的性质,我们自然可以得到:余数变成了
。
所以,状态转移方程如下:
最后的答案是什么?
首先,第一维自然是
,那么第二维取什么值呢?
显而易见,要求是
的倍数,所以第二维是
。
综上所述,最后的答案是
。