http://codeforces.com/problemset/problem/55/D

Beautiful Numbers : 这个数能整除它的全部位上非零整数。问[l,r]之间的Beautiful Numbers的个数。



若一个数能整除它的全部的非零数位。那么相当于它能整除个位数的最小公倍数。

因此记忆化搜索中的參数除了len(当前位)和up(是否达到上界),有一个prelcm表示前面的数的最小公倍数。推断这个数是否是Beautiful Numbers,还要有一个參数表示前面数,可是这个数太大,须要缩小它的范围。



难点:

缩小前面组成的数的范围。

能够发现全部个位数的最小公倍数是2520,如果当前的Beautiful Numbers是x,

那么 x % lcm{dig[i]} = 0, 

又 2520%lcm{dig[i]} = 0,

那么x%2520%lcm{ dig[i] } = 0,x范围由9*10^18变为2520。





处理超内存问题。



经过分析后能够设出dp[20][2050][2050],dp[i][j][k]表示处理到i位,前面的数的最小公倍数为j。前面的数%2520为k。

但这样




明显会TLE。。

由于1~9组成的最小公倍数仅仅有48个,能够离散化,这样数组就降到了dp[20][50][2520]。











  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <set>
  5. #include <list>
  6. #include <stack>
  7. #include <vector>
  8. #include <math.h>
  9. #include <string.h>
  10. #include <queue>
  11. #include <string>
  12. #include <stdlib.h>
  13. #include <algorithm>
  14. //#define LL __int64
  15. #define LL long long
  16. #define eps 1e-12
  17. #define PI acos(-1.0)
  18. using namespace std;
  19. const int INF = 0x3f3f3f3f;
  20. const int maxn = 4010;
  21. const int max_lcm = 2520;
  22.  
  23. LL gcd(LL a, LL b)
  24. {
  25. if(b == 0)
  26. return a;
  27. return gcd(b,a%b);
  28. }
  29. LL lcm(LL a, LL b)
  30. {
  31. return a/gcd(a,b)*b;
  32. }
  33. int dig[25];
  34. LL dp[25][50][2525];
  35. int hash[2525];
  36.  
  37. LL dfs(int len, int prelcm, int prenum, int up)
  38. {
  39. if(len == 0)
  40. {
  41. return prenum%prelcm == 0;
  42. }
  43. if(!up && dp[len][hash[prelcm]][prenum] != -1)
  44. return dp[len][hash[prelcm]][prenum];
  45. int n = up ?
  46.  
  47. dig[len] : 9;
  48. LL res = 0;
  49. for(int i = 0; i <= n; i++)
  50. {
  51. int nownum = (prenum*10+i)%max_lcm;
  52. int nowlcm = prelcm;
  53. if(i)
  54. nowlcm = lcm(prelcm,i);
  55. res += dfs(len-1,nowlcm,nownum,up&&i==n);
  56. }
  57. if(!up)
  58. dp[len][hash[prelcm]][prenum] = res;
  59. return res;
  60. }
  61.  
  62. LL cal(LL num)
  63. {
  64. int len = 0;
  65. while(num)
  66. {
  67. dig[++len] = num%10;
  68. num /= 10;
  69. }
  70. return dfs(len,1,0,1);
  71. }
  72.  
  73. int main()
  74. {
  75. int test;
  76. LL a,b;
  77. int cnt = 0;
  78. for(int i = 1; i <= 2520; i++) //离散化
  79. {
  80. if(max_lcm % i == 0)
  81. hash[i] = ++cnt;
  82. }
  83.  
  84. scanf("%d",&test);
  85. memset(dp,-1,sizeof(dp));
  86. for(int item = 1; item <= test; item++)
  87. {
  88. scanf("%I64d %I64d",&a,&b);
  89. printf("%I64d\n",cal(b) - cal(a-1));
  90. }
  91.  
  92. return 0;
  93. }



CF D. Beautiful numbers (数位dp)的更多相关文章

  1. CF 55D. Beautiful numbers(数位DP)

    题目链接 这题,没想出来,根本没想到用最小公倍数来更新,一直想状态压缩,不过余数什么的根本存不下,看的von学长的blog,比着写了写,就是模版改改,不过状态转移构造不出,怎么着,都做不出来. #in ...

  2. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...

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

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

  4. Codeforces Beta Round #51 D. Beautiful numbers 数位dp

    D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...

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

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

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

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

  7. cf55D. Beautiful numbers(数位dp)

    题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也 ...

  8. Codeforces - 55D Beautiful numbers (数位dp+数论)

    题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...

  9. CF55D Beautiful numbers (数位dp)

    题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ...

  10. codeforces 55D. Beautiful numbers 数位dp

    题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...

随机推荐

  1. ACM_鸡兔同笼(二元一次方程)

    鸡兔同笼 Time Limit: 2000/1000ms (Java/Others) Problem Description: 今有雉兔同笼,上有n头,下有m足,问雉兔各几何? Input: 输入有多 ...

  2. 1.0 windows10系统安装步骤(1)

    1.0 windows10系统安装步骤(1) 根据自己对笔记本系统的折腾,为了方便他人系统的安装,故总结笔记本系统的安装步骤 目录: 1.0 [windows10系统安装步骤(1)] 2.0 Linu ...

  3. 3A课程笔记分享_StudyJams_2017

    课程3A-面向对象编程(上) 概述 面向对象的思想在当今的软件开发中占据着主导地位. Java是一门完全面向对象的语言,是一种天然的分布式互联网软件的开发语言,在当今企业级应用中占据绝对领先地位,也是 ...

  4. dubbo之线程模型

    事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发起新的IO请求 ...

  5. PCL:描述三维离散点的ROPS特征(Code)

    前言: 三维点云为三维欧式空间点的集合.对点云的形状描述若使用局部特征,则可分为两种:固定世界坐标系的局部描述和寻找局部主方向的局部描述,ROPS特征为寻找局部主方向的特征描述. 1.寻找主方向(对X ...

  6. Linux删除重复内容命令uniq笔记

    针对文本文件,有时候我们需要删除其中重复的行.或者统计重复行的总次数,这时候可以采用Linux系统下的uniq命令实现相应的功能. 语法格式:uniq [-ic] 常用参数说明: -i 忽略大小写 - ...

  7. BZOJ 4817: [Sdoi2017]树点涂色 LCT+Access的性质+DFS序+线段树

    Code: #include<bits/stdc++.h> #define maxn 200003 #define inf -1000000 using namespace std; vo ...

  8. Scrapy处理200-300范围之外的响应代码

    HttpErrorMiddleware 类scrapy.spidermiddlewares.httperror.HttpErrorMiddleware 过滤掉不成功(错误)的HTTP响应,以便蜘蛛不必 ...

  9. js数组对象去重

    转: https://www.cnblogs.com/gaoht/p/9850449.html 在数组对象中去掉重复的对象: export function deteleObject(obj) { v ...

  10. echarts常用实例

    1.柱状图: 1.需要动态加载的参数是x轴以及柱状图的数值,legendData和seriesData.demo使用是可以直接写死参数,在执行this.initChart()方法即可.具体代码可以参数 ...