B数计数【数位DP】

>Link

ybtojB数计数


>Description

求1到n当中有多少个数满足:十进制下既包含子串"13",又能被13整除
其中 1 ≤ n ≤ 1 0 9 1≤n≤10^9 1n109


>解题思路

数位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的含义:

  1. k = = 0 k==0 k==0:当前不包含"13"
  2. k = = 1 k==1 k==1:当前最后一位为"1"
  3. 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位填一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值