数位dp
winhcc
这个作者很懒,什么都没留下…
展开
-
hdu 4734 F(x)
数位dp题,给一个数x,把x的每一位附上权值就变成了F(x)(具体赋权值的方法见题目),计算0-b里面有多少x使得F(x)>F(a)成立。 先把F(a)求出来,a<10^9可知F(a)<F(999999999) = 9*(1+2+2 ^ 2……+2 ^ 8) = 9*(2^9-1) ,大约是4500左右,定义两个状态,pos和num,即当前的位置和剩下的值,然后套用数位dp就好了...原创 2019-03-08 20:59:36 · 207 阅读 · 0 评论 -
hdu 2089
求[l,r]中不含4或者62的数的个数。 数位dp计数,d[pos][st]表示在pos 位 状态为st的合法数,st为1表示上一位是6,所有若这一位是2就不能下一位的继续计数。 #include <cstdio> #include <cstring> using namespace std; typedef long long LL; LL bits[40],d[40...原创 2019-04-01 10:50:01 · 78 阅读 · 0 评论 -
hdu 3555
给一个数n,求出1-n中含有49的数的个数。 和数字的某些位相关,数位dp,dp[pos][st]表示第pos及以后的位任取数字,状态为st的情况下合法的数字个数,st有三个: 前面出现了49,为 2 上一位是4 为1 没出现过49且上一位不是4 ,为0 套用数位dp即可 #include <cstdio> #include <cstring> using namespa...原创 2019-04-01 20:11:11 · 258 阅读 · 0 评论 -
poj 3252
求[l,r]里面有多少数在二进制的表示下0的个数大于1的个数。 二进制的数位dp, 需要注意的是数种0的数量需要从最高位是1的情况下开始计算。比如00000010(2)的0 的个数不是7而是1. #include <cstdio> #include <cstring> using namespace std; typedef long long LL; LL bits[...原创 2019-04-01 20:37:34 · 138 阅读 · 0 评论 -
hdu 3709
求[l,r]中的平衡数,平衡数就是找一个位,左右两边的各个位上的数字乘到平衡位的距离和相等。 需要枚举哪一位是平衡位。 最大的数可以达到10^18,1e18-1如选最高位作为平衡点的话一段是0,一端是9+92+93+…+916 = 89*17 = 1224,求得了一端最大的和是1224,所以选取2000为起始点,就不用考虑负数时数组越界的问题了。 #include <cstdio> #...原创 2019-04-01 20:48:48 · 191 阅读 · 0 评论 -
hdu 3652
求[1,n]种出现过13并且能被13整除的数字的个数,只比hdu 3555多了一个维度,即记录数字模13的余数 #include <cstdio> #include <cstring> using namespace std; typedef long long LL; LL n,bits[20],d[20][20][3]; LL dp(int pos,int mod,...原创 2019-04-01 20:58:04 · 178 阅读 · 0 评论