之前的文章已经讲过如何求1—r中的特殊数,这篇博客就来讲些进阶操作;

直接看例题(hdu2089):

(题目是中文的我就不写大意了)

这题与hdu3555最大的区别就是规定了l,不再以1开始;

解决这个问题也很简单,利用前缀和的思想,先计算1—l-1特殊数的数量,在计算l—r的数量,相减就是答案了;

附上丑陋的代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. #define int long long
  5. const int MAXN=;
  6. int n,r,t,digit[MAXN],dp[MAXN][MAXN],t2,l;
  7. int dfs(int pos,int pre,bool limit)
  8. {
  9. if(pos==) return ;
  10. if(!limit && dp[pos][pre] != )
  11. {
  12. return dp[pos][pre];
  13. }
  14. int up=;
  15. if(limit) up=digit[pos];
  16. int ans=;
  17. for(int i=;i<=up;++i)
  18. if(pre==&&i==||i==)
  19. continue;
  20. else
  21. {
  22. ans+=dfs(pos-,i,limit&&(i==digit[pos]));
  23. }
  24. if(!limit)
  25. {
  26. dp[pos][pre] = ans;
  27. }
  28. return ans;
  29. }
  30. void solve(int y,int x)
  31. {
  32. t=;
  33. int xx=x;
  34. while(x>)
  35. {
  36. ++t;
  37. digit[t]=x%;
  38. x=x/;
  39. }
  40. int ans2=dfs(t,,);
  41. t=;
  42. --y;
  43. xx=y;
  44. while(y>)
  45. {
  46. ++t;
  47. digit[t]=y%;
  48. y=y/;
  49. }
  50. int ans=dfs(t,,);
  51. printf("%lld\n",ans2-ans);
  52. }
  53. main()
  54. {
  55. while(cin>>l>>r)
  56. {
  57. if(l==&&r==) return ;
  58. solve(l,r);
  59. }
  60. }

例题2(hdu3652):

手(帮)动(你)翻译(太懒了,不想写题意)

这题又与上题有些不同,不仅要满足含13,还要整除13;

具体实现也不难,只要在搜索的同时记录数字除以13的余数;

怎么传递呢?这又要考小学奥数了,余数的性质;

  1. ()ab的和除以c的余数(ab两数除以c在没有余数的情况下除外),等于ab分别除以c的余数之和(或这个和除以c的余数)。例如,,16除以5的余数分别是31,所以(+)除以5的余数等于3+=。注意:当余数之和大于除数时,所求余数等于余数之和再除以c的余数。例如,,19除以5的余数分别是34,所以(+)除以5的余数等于(+)除以5的余数。
  2.  
  3. ()ab的乘积除以c的余数,等于ab分别除以c的余数之积(或这个积除以c的余数)。例如,,16除以5的余数分别是31,所以(×)除以5的余数等于3×=。注意:当余数之积大于除数时,所求余数等于余数之积再除以c的余数。例如,,19除以5的余数分别是34,所以(×)除以5的余数等于(×)除以5的余数。
  4.  
  5. 性质()()都可以推广到多个自然数的情形。

太长不想看也不要紧,总结一下就是$a \times 100+b \times 10+c$ % $ d = a \times 100 $%$ d+b \times 10 $%$ d +c $%$ d$;

这有什么用呢,这个性质可以让我们在传递的时候,只要把余数$\times 10$再加上现在选取的数 mod 13就可以了,最后看是否满足条件

附上水代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. #define int long long
  5. const int MAXN=;
  6. int n,r,t,digit[MAXN],dp[MAXN][MAXN][MAXN][];
  7. int dfs(int pos,int pre,bool limit,int mo,bool have,int sum)
  8. {
  9. if(pos==)
  10. {
  11. if(mo==&&have)
  12. {
  13. return ;
  14. }
  15. else
  16. return ;
  17. }
  18. if(!limit&&dp[pos][pre][mo][have]!=) return dp[pos][pre][mo][have];
  19. int up=;
  20. if(limit) up=digit[pos];
  21. int ans=;
  22. for(int i=;i<=up;++i)
  23. if(pre==&&i==)
  24. ans+=dfs(pos-,i,limit&&(i==digit[pos]),(mo*+i)%,,sum*+i);
  25. else
  26. ans+=dfs(pos-,i,limit&&(i==digit[pos]),(mo*+i)%,have,sum*+i);
  27. if(!limit) dp[pos][pre][mo][have]=ans;
  28. return ans;
  29. }
  30. void solve(int x)
  31. {
  32. t=;
  33. int xx=x;
  34. while(x>)
  35. {
  36. ++t;
  37. digit[t]=x%;
  38. x=x/;
  39. }
  40. printf("%lld\n",dfs(t,,,,,));
  41. }
  42. main()
  43. {
  44. while(cin>>r)
  45. {
  46. solve(r);
  47. }
  48. }

又这样水过了一篇博客;

数位dp进阶(hdu2089,3652)的更多相关文章

  1. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  2. 华东交通大学 2019 I 不要666 数位dp进阶

    Problem Description 题库链接 666是一个网络用语,用来形容某人或某物很厉害很牛.而在西方,666指魔鬼,撒旦和灵魂,是不吉利的象征.所以邓志聪并不喜欢任何与6有关的数字.什么数字 ...

  3. 【数位DP】Hdu 3652:B-number

    B-number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. 【数位dp】hdu2089 不要62

    http://www.cnblogs.com/xiaohongmao/p/3473599.html #include<cstdio> using namespace std; int n, ...

  5. 数位DP学习笔记

    数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...

  6. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. 【HDU 3652】 B-number (数位DP)

    B-number Problem Description A wqb-number, or B-number for short, is a non-negative integer whose de ...

  8. [您有新的未分配科技点]数位dp:从懵X到板子(例题:HDU2089 不要62)

    数位dp主要用来处理一系列需要数数的问题,一般套路为“求[l,r]区间内满足要求的数/数位的个数” 要求五花八门……比如“不出现某个数字序列”,“某种数的出现次数”等等…… 面对这种数数题,暴力的想法 ...

  9. Hdu 3652 B-number (同余数位DP)

    题目链接: Hdu 3652 B-number 题目描述: 给出一个数n,问 [1, n]区间内有几个数能被13整除并且还有13这个子串? 解题思路: 能整除的数位DP,确定好状态随便搞搞就能过了.d ...

随机推荐

  1. Hand on Machine Learning第三章课后作业(2):其余小练习

    -#!/usr/bin/env python -# # # -- coding: utf-8 -- -# # # @Time : 2019.5.22 14:09 -# # # @Author : An ...

  2. MyEclipse mac版删除代码崩溃--解决方案

    Mac升级了系统到 High Sierra但MyEclipse却没更新(一般用PO JIE),这总情况的MyEclipse在一些特定的正常操作中总会强行崩溃 极大的影响的Mac程序员的编码,面对这种问 ...

  3. 函数 FUNCTION

    函数 FUNCTION 定义: 带名字的代码块,用于执行具体任务. 注意: 应给函数指定描述性名称,只是用小写字母和下划线. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何 ...

  4. net 架构师-数据库-sql server-001-SQL Server中的对象

    1.1 数据库的构成 1.2 数据库对象概述 1.2.1 数据库对象 RDBMS 关系数据库管理系统 对象:数据库.索引.事务日志.CLR程序集.表 .报表.文件组.全文目录.图表.用户自定义数据类型 ...

  5. JS封装插件:实现文件读写功能

    scripting.FileSystemObject是一个可以实现文件读写的COM组件,由于COM组件可以被跨语言调用,因此可以选择像vbs或者JS这种脚本语言调用,下面我就使用该COM组件封装了一个 ...

  6. 基于 Redux + Redux Persist 进行状态管理的 Flutter 应用示例

    好久没在 SegmentFault 写东西,唉,也不知道 是忙还是懒,以后有时间 再慢慢写起来吧,最近开始学点新东西,有的写了,个人博客跟这里同步. 一直都在自己的 React Native 应用中使 ...

  7. Linux部署项目 shell脚本启动 及 Centos7开放指定端口

    我们首先要在linux上安装好jdk   tomcat   mysql  这些基本环境,这些可以在楼主的  Linux入门   里面找到. linux部署spring项目 1. 右击项目,maven ...

  8. Vue 中如何定义全局的变量和常量

    Vue 中如何定义全局的变量和常量 我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入. 尝试1:创建 global.js 并且在其中定义   let a = 10 ...

  9. java体系中OOP,OOD,OOA分别代表什么含义,以及OA,CRM,ERP

    OOP:Object Oriented Programming 面向对象程序设计. OOD:Object Oriented Design 面向对象设计. OOA:Object Oriented Ana ...

  10. arcgis server10.2自带打印模板路径

    找到arcgis server10.2安装目录路径,我的安装路径为C盘,如下: C:\Program Files\ArcGIS\Server\Templates\ExportWebMapTemplat ...