>Link
ybtojB数计数
>Description
求1到n当中有多少个数满足:十进制下既包含子串"13",又能被13整除
其中 1 ≤ n ≤ 1 0 9 1≤n≤10^9 1≤n≤109
>解题思路
数位DP的模板题
#==
一直RE调试了超级久,后来搜系统信息“Killed: Floating point exception”,看到有人说是除0的情况,但是我的码并没有除0的情况啊😅又调了好久,无奈之下把原来的方法改成不用除法的方法,然后就A了😅
f i , j , k f_{i,j,k} fi,j,k表示前面填了 i i i位数,当前的余数为 j j j,包含"13"的状态为 k k k
k k k的含义:
- k = = 0 k==0 k==0:当前不包含"13"
- k = = 1 k==1 k==1:当前最后一位为"1"
- k = = 2 k==2 k==2:当前已包含"13"
我们DP,不断在后面添数,就可以算出来了。状态如何转移挺好推的,需要分类讨论,要注意下当前为1和3的情况
但是范围规定了1到n
设n有m位
位数小于m位的,显然每位数的位置可以随便填
位数等于m位的,可以发现,如果当前位填的数比 n n n对应位上的数小,那么后面位上的数就可以随便填
我们可以直接枚举 i i i,表示 i i i之前的位都和 n n n对应,让第 i i i位填一