CodeForces 55D Beautiful numbers
CodeForces 55D Beautiful numbers
一句话题意:有T组询问,每次询问区间[l, r]中的beautiful number有多少。beautiful number是指这个数可以被组成它的数字整除。例如15是beautiful number,因为15可以被1整除,也可以被5整除。25不是beautiful number, 25不能被2整除。
Solution
想到一半跑去水题解了,真不想不到还有个2520……
第一选择方法
拿到题之后还是先想了暴力
枚举每一位上的数字判断整除
那一看数据范围竟然达到了9e18
那就是数位DP
实质上数位DP也是一种暴力枚举的方式
判断各个区间满足条件的个数
第二处理第一步:如何判断能否被整除
显然要取每一位上的数字的最小公倍数
第三步数组的定义
老规矩,先看题意里面需要我们记录什么
数位DP肯定要有数位
判断是否整除需要当前的数和最小公倍数
那么就是三维数组dp[数位][当前的数][最小公倍数]
第四步数组的空间占用
第一维20位
第二维要对2520取mod,因为1~9的最小公倍数是2520(没想到)
考虑到第三维会有许多数字不会出现,例如质数之类的
所以只记录2520的因数,共48个,可打表取出
第五步也是最后一步
状态转移方程
\(dp[i][j][k]={\sum _{x=1}^{x_{max}}}\)\(dp[i-1][(j*10+x)\)%\(2520]\)\([lcm(k,x)]\)
代码还没写……
风吹过,我来过~