题意:

找出区间[li,ri]内有多少数满足,这个数的每一个位的非0数都能把这个数整除

题解:

因为这个数每一位的值都可以把这个数整除,那也就是说这个数是它所有位数的公倍数,但是可能不是最小公倍数。

1、2、3、4、5、6、7、8、9的最小公倍数是2520

那么我就可以让我们要判断的那个数去取余2520来实现我们记忆化操作

因为1——9的最小公倍数是2520,所以1——9中任意几个数的最小公倍数肯定是2520的余数,所以我们只需要找出来1——2520之中所有2520的余数就可以了。最后找出来也就48个

给这48个位置每一个映射一个值

这个样子就又可以减小dp数组的大小

dp[x][y][z]表示:枚举到第x位,这个数取余2520的结果是y,这个数目前所有位数的最小公倍数所对应的映射是z

代码:

 1 //首先要求能被各位上的数整除,可以转化为被一个数整除问题。
2 //这个数就是各位上数的最小公倍数LCM(不是GCD)。
3 //其次,处理整除问题,得转化成数位DP的余数模板。1~9的LCM最大是2520, 那么%2520,让其可以开数组进行记忆化搜索。
4 //最后, 对于不能%2520最后结果,再%各个数位累计过来的LCM。
5 //这样下来,需要开20*2520*2520的数组,往CF上一交你会发现MLE。
6 //仔细观察每次的LCM,其范围是1~2520没错,但是都是整除gcd的结果(LCM=a*b/gcd(a,b) ),也就是说所有LCM都是某个数的约数。
7 //这个数其实就是2520。所以DP之前,为2520打个表,把LCM给离散化Hash。这样其实只有48个LCM了。数组开20*2520*50即可。
8 //注意结果是int64。
9 #include<stdio.h>
10 #include<string.h>
11 #include<algorithm>
12 #include<iostream>
13 #include<map>
14 using namespace std;
15 const int maxn=20;
16 const int mod=2520;
17 typedef long long ll;
18 ll v[maxn],dp[maxn][mod+50][50];
19 map<ll,ll>w;
20 ll lcm(ll a,ll b)
21 {
22 ll ans=min(a,b);
23 while(ans)
24 {
25 if(a%ans==0 && b%ans==0) break;
26 ans--;
27 }
28 return (a*b)/ans;
29 }
30 ll dfs(ll pos,ll sum,ll sta,bool limit)
31 {
32 if(sta==0)return 0;
33 if(pos==-1)
34 {
35 return sum%sta==0;
36 }
37 if(!limit && dp[pos][sum][w[sta]]!=-1) return dp[pos][sum][w[sta]];
38 ll up=limit?v[pos]:9;
39 ll tmp=0;
40 for(ll i=0;i<=up;++i)
41 {
42 if(i>0)
43 {
44 tmp+=dfs(pos-1,(sum*10+i)%mod,lcm(sta,i),limit && i==v[pos]);
45
46 }
47 else tmp+=dfs(pos-1,(sum*10+i)%mod,sta,limit && i==v[pos]);
48 }
49 if(!limit) dp[pos][sum][w[sta]]=tmp;
50 //只有上界为9的时候才会往dp数组里面存,因为这样能节省更多的时间
51 return tmp;
52 }
53 ll solve(ll ans)
54 {
55 ll pos=0;
56 while(ans)
57 {
58 v[pos++]=ans%10;
59 ans/=10;
60 }
61 return dfs(pos-1,0,1,true);
62 }
63 int main()
64 {
65 ll t,l,r,m=0;
66 scanf("%I64d",&t);
67 for(ll i=1;i<=mod;++i)
68 {
69 if(mod%i==0)
70 {
71 ++m;
72 w[i]=m;
73 }
74 }
75 memset(dp,-1,sizeof(dp));
76 while(t--)
77 {
78 scanf("%I64d%I64d",&l,&r);
79 printf("%I64d\n",solve(r)-solve(l-1));
80 }
81 w.clear();
82 return 0;
83 }

Beautiful numbers CodeForces - 55D的更多相关文章

  1. codeforces 55d//Beautiful numbers// Codeforces Beta Round #51

    题意:一个数能整除它所有的位上的数字(除了0),统计这样数的个数. 注意离散化,为了速度更快需存入数组查找. 不要每次memset,记录下已有的长度下符合条件的个数. 数位dp肯定是从高位到低位. 记 ...

  2. CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)

    传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...

  3. Codeforces 55D. Beautiful numbers(数位DP,离散化)

    Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得 ...

  4. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  5. CodeForces 55D Beautiful numbers

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  6. CodeForces - 55D Beautiful numbers —— 数位DP

    题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds me ...

  7. CodeForces - 55D - Beautiful numbers(数位DP,离散化)

    链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ...

  8. Codeforces 55D Beautiful Number

    Codeforces 55D Beautiful Number a positive integer number is beautiful if and only if it is divisibl ...

  9. [codeforces 55]D. Beautiful numbers

    [codeforces 55]D. Beautiful numbers 试题描述 Volodya is an odd boy and his taste is strange as well. It ...

随机推荐

  1. SQL注入-流程

    一般注入分类: 时间,布尔,报错,堆,联合 有关函数介绍: current_user() 当前用户名 session_user() 链接数据库的用户名 @@basedir mysql安装路径 @@da ...

  2. 【UML】Use Case Diagrams

    文章目录 Use Case Diagrams Introduction Use case Diagram Use Case Diagrams - Actors Use Case Diagrams – ...

  3. 【Oracle】delete表后commit后怎么找回,方法

    有些时候,不小心删除了一些需要的表,而且数据库不能停止,只能一直运行下去,这样的话很麻烦 下面介绍的方法就是删除表后通过时间戳后者scn找回删除的数据 模拟实验环境: 创建一个新表 SQL> c ...

  4. USB限流芯片,4.8A最大,过压关闭6V

    PW1503,PW1502是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路保护.它具有超温保护以及反向闭锁功能. PW1503,PW1502采用薄型(1毫米)5针薄型SOT2 ...

  5. 数据库性能调优之始: analyze统计信息

    摘要:本文简单介绍一下什么是统计信息.统计信息记录了什么.为什么要收集统计信息.怎么收集统计信息以及什么时候收集统计信息. 1 WHY:为什么需要统计信息 1.1 query执行流程 下图描述了Gau ...

  6. 前端面试之HTTP

    前端面试之HTTP的基本性质 1 HTTP代理 在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息.简而言之,他们中间的部分就是代理! 代理的作用 缓存(可以是公开的也可以是私有的,像浏览 ...

  7. gradles理解和文件配置

    gradle gradle tasks :查看所有的taske命令 bootJar:打包,讲项目的所有依赖和主工程代码打包,一个可直接执行的一个包,不需要tomcat运行 gradle使用bootja ...

  8. 陈思淼:阿里6个月重写Lazada,再造“淘宝”的技术总结

    小结: 1. 所谓的中台技术,就是从 IDC,网络,机房,操作系统,中间件,数据库,算法平台,数据平台,计算平台,到业务平台,每一层都有清晰的定义和技术产品. 具体来看,首先,集团技术的分层和每层的产 ...

  9. What is :: (double colon) in Python when subscripting sequences?

    What is :: (double colon) in Python when subscripting sequences? 15 Extended Slices https://docs.pyt ...

  10. 分别简述computed和watch的使用场景

    computed: 当一个属性受多个属性影响的时候就需要用到computed 最典型的栗子: 购物车商品结算的时候watch: 当一条数据影响多条数据的时候就需要用watch 栗子:搜索数据