题意:有T组询问,每次询问区间[l, r]中的beautiful number有多少。beautiful number是指这个数可以被组成它的数字整除。例如15是beautiful number,因为15可以被1整除,也可以被5整除。25不是beautiful number, 25不能被2整除。

思路:很明显和数位有关,肯定是数位DP,然而题目中的这个条件不太好状态转移。题目中要求beautiful number可以被组成它的数字整除,也就是说它可以被组成它的数字的lcm整除。而1,2,......9的lcm是2520。那么我们把所有的数字对2520取模不会改变beautiful number的成立条件。因为1到9的数字的lcm是2520,那么1到9中的任意一些数的lcm(假设这个lcm数值为x)不会超过2520,并且x一定是2520的约数。所以,假设有一个数y%x == 0,那么y和x都取模2520之后等式仍然成立。这样状态数就大大减少了。设dp[i][j][k]为第i位,最高位到第i + 1位构成的数取模2520为j的数最高位到第i + 1位的数的lcm是k的方案数。这样假设我们询问1到x之间有多少个beautiful number可以用试填法来解决。我们需要枚举每一位填什么数来进行状态转移。假设数x的第i位是y,第i + 1位传进来了一个flag。flag是用来判断这一位可不可以填所有的数。如果可以,那么0到9都可以填。如果不可以,就只能填0 到 y。例如数字是123, 假设十位填的是1,那么个位填什么数都可以(flag此时是0)。假设10位是2,那么各位只能填0到3之间的数。通过枚举每一位填什么数来进行状态转移。

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int mod = 2520;
LL dp[19][2525][50];
int mp[2525], re[20];inline int gcd(int a, int b) {return b ? gcd(b, a % b) : a;
}inline int lcm (int a, int b) {if(a == 0 || b == 0)return a + b;return a * b / gcd(a, b);
}LL dfs(int deep, int num, int now, bool flag) {if(deep == 0) return (num % now == 0);if(flag == 0 && dp[deep][num][mp[now]] != -1) return dp[deep][num][mp[now]];LL ans = 0, end;if(flag == 1) end = re[deep];else end = 9;for (int i = 0; i <= end; i++) {ans += dfs(deep - 1, (num * 10 + i) % mod, lcm(now, i), flag & (i == end));}if(flag == 0) dp[deep][num][mp[now]] = ans;return ans;
}LL cal(LL num) {int deep = 0;while(num) {re[++deep] = num % 10;num /= 10;}return dfs(deep, 0, 1, 1);
}
int main() {int cnt = 0, T;for (int i = 1; i <= mod; i++) {if(mod % i == 0) {mp[i] = ++cnt;} }memset(dp, -1, sizeof(dp));scanf("%d", &T);while(T--) {LL a, b;scanf("%lld%lld", &a, &b);printf("%lld\n", cal(b) - cal(a - 1));}
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/10432754.html

Codeforces 55D Beautiful numbers (数位DP)相关推荐

  1. CF 55D Beautiful numbers 数位DP

    思路: 要找一个数能被他的所有反的数字整除,只需求出这个数能被其数字的LCM整除.而LCM最大为5*7*8*9=2520: 如果直接开dp[20][2520][2520]会超内存,而2^3,3^2,5 ...

  2. Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化

    传送门 文章目录 题意: 思路: 题意: 思路: 数位dpdpdp挺经典的一个题辣,有一个很明显的状态就是f[pos][num][lcm]f[pos][num][lcm]f[pos][num][lcm ...

  3. CodeForces - 55D Beautiful numbers

    题目链接:http://codeforces.com/problemset/problem/55/D 题意:求区间[L,R]有多少个Beautiful numbers.Beautiful number ...

  4. CodeForces - 628D Magic Numbers(数位dp)

    题目链接:点击查看 题目大意:首先规定一个不含前导零的数字如果满足: 从最高位开始,偶数位置全为 ddd 从最高位开始,奇数位置不能出现 ddd 则称该数字为 d−magicd-magicd−magi ...

  5. codeforces 628D. Magic Numbers 数位dp

    题目链接 给两个数m, d. 两个数a, b. a, b长度小于2000, 长度相等.求在a, b之间的数x, x%m==0, 并且从高位往低位数, 奇数位的数全部不等于d, 偶数为的数全都等于d, ...

  6. CodeForces 215E Periodical Numbers 数位DP

    题意:给你一个区间[l,r],求这个区间内满足条件的数,条件是:这个数的二进制表示时,dig[i] == dig[i+k],(0<k<len,且len%k==0,len为这个数的二进制代码 ...

  7. CodeForces 215E Periodical Numbers 数位DP

    这题做了有好几天了,终于过了= = 完全不懂网上题解的递推写法,只能自己用记忆化搜索瞎搞,总算是搞出来了. 具体策略就是记忆化搜索的时候用一个tmp数组记录最前面len个的值,然后后面的数字必须要和前 ...

  8. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  9. Codeforces 55D Beautiful Number (数位统计)

    把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容:  a positive integer number is beautiful if and only if it is  ...

最新文章

  1. 五年磨砺:微软Vista开发过程全记录
  2. 【fedora12】vlc-2.0.0编译
  3. trace Linux and实例,traceroute在linux中的使用方法
  4. Grafana Prometheus 服务安装部署(Linux服务器监控)
  5. json_decode用法
  6. Vertica系列: Vertica DB连接负载均衡
  7. 以太坊合约24小时新增2.44万ETH
  8. selenium的运行时异常
  9. mysql dbversion_爱可生详解MySQL|不能从MySQL 8.0 复制到 5.8?一招教你解决
  10. 没有安装python如何运行py_在没有安装Python的前提下,让Sublime text编辑器来运行Py?...
  11. STM32F103 用CS1237 /HX711 芯片制作电子秤
  12. UML学习_2_参与者
  13. 简单是王道《九、讲故事》
  14. latex强制图片标题居中
  15. Java 实现企业级支付
  16. mysql 函数 人民币大写_PHP人民币转大写函数
  17. c语言字符串md5加密解密,.net core使用MD5加密解密字符串
  18. SVGDeveloper制作矢量地图教程详解
  19. 高频交易配对交易学习——Copulas函数理解
  20. pmos低电平驱动_MOS管的低端驱动和高端驱动

热门文章

  1. 港中文开源 | 融合视频目标检测与单目标、多目标跟踪
  2. 147页详述「结构在神经网络中的复兴」,图注意力网络一作博士论文公开
  3. java 旅行家的预算_旅行家的预算
  4. MATLAB App Designer GUI开发从0到1(二)
  5. 机械指挥官——全国领先的工程机械管理平台
  6. 为什么在实际的 kaggle 比赛中 gbdt 和 random forest 效果非常好?
  7. 结合图拉普拉斯的半监督学习
  8. java 抽象封装多态_java面向对象(封装,继承,多态,抽象,接口的定义和实现)...
  9. java lobo使用_[持续更新]Cobra:Java HTML parser用法详解
  10. 华为鸿蒙系统学习笔记8-开发者生态建设