题目大意:求区间$[l,r]$中数字$0\sim9$出现个数

题解:数位$DP$

卡点:

C++ Code:

  1. #include <cstdio>
  2. #include <iostream>
  3. struct node {
  4. long long s[10], sum;
  5. inline node() {for (register int i = 0; i < 10; i++) s[i] = 0; sum = 0;}
  6. inline node(int x) {for (register int i = 0; i < 10; i++) s[i] = 0; sum = x;}
  7. inline friend node operator + (const node &lhs, const node &rhs) {
  8. node res;
  9. res.sum = lhs.sum + rhs.sum;
  10. for (register int i = 0; i < 10; i++) res.s[i] = lhs.s[i] + rhs.s[i];
  11. return res;
  12. }
  13. inline friend node operator - (const node &lhs, const node &rhs) {
  14. node res;
  15. res.sum = lhs.sum - rhs.sum;
  16. for (register int i = 0; i < 10; i++) res.s[i] = lhs.s[i] - rhs.s[i];
  17. return res;
  18. }
  19. inline friend std::ostream & operator << (std::ostream &Fout, const node __node) {
  20. for (register int i = 0; i < 10; i++) {
  21. Fout << __node.s[i];
  22. Fout << (i == 9 ? '\n' : ' ');
  23. }
  24. return Fout;
  25. }
  26. };
  27.  
  28. int num[20], tot;
  29. node f[20];
  30. bool vis[20];
  31. node calc(int x, int lim, int lead) {
  32. if (!x) return node(1);
  33. if (!lim && lead && vis[x]) return f[x];
  34. node F;
  35. for (int i = lim ? num[x] : 9, op = 1; ~i; i--, op = 0) {
  36. node tmp = calc(x - 1, lim && op, lead || i);
  37. F = F + tmp;
  38. if (i || lead) F.s[i] += tmp.sum;
  39. }
  40. if (!lim && lead) f[x] = F, vis[x] = true;
  41. return F;
  42. }
  43. node solve(long long x) {
  44. if (x < 0) return node();
  45. tot = 0;
  46. while (x) {
  47. num[++tot] = x % 10;
  48. x /= 10;
  49. }
  50. return calc(tot, 1, 0);
  51. }
  52. long long l, r;
  53. int main() {
  54. std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
  55. std::cin >> l >> r;
  56. std::cout << solve(r) - solve(l - 1) << std::endl;
  57. return 0;
  58. }

  

[洛谷P2602][ZJOI2010]数字计数的更多相关文章

  1. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

  2. 洛谷 P2602 [ZJOI2010]数字计数

    洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...

  3. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  4. 洛谷P2602 [ZJOI2010]数字计数 题解

    题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...

  5. 洛谷P2602 [ZJOI2010] 数字计数 (数位DP)

    白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usin ...

  6. BZOJ1833或洛谷2602 [ZJOI2010]数字计数

    BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...

  7. 【洛谷P2602】数字计数

    题目大意:求 [a,b] 中 0-9 分别出现了多少次. 题解:看数据范围应该是一个数位dp. 在 dfs 框架中维护当前的位置和到当前位置一共出现了多少个 \(x,x\in [0,9]\).因此,用 ...

  8. P2602 [ZJOI2010]数字计数(递推)

    P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...

  9. P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业

    P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...

随机推荐

  1. vue $set修改数组

    看了别人写的,自己简单写一下自己的理解. 因为 JavaScript 的限制,Vue.js 不能检测到下面数组变化,所以,想要正常是不能通过操作数组来渲染dom的,解决的方法是通过set方法, 在组件 ...

  2. 解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误

    解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误 今天安装启动nginx的时候报 ...

  3. Str_turn

    public class Str_turn { public static void main(String args[]) { String Str1 = new String("This ...

  4. HyperLedger Fabric 1.4 超级账本起源(5.1)

    至比特币开源以来,无数技术人员对其进行研究,并且对该系统经过了无数次改进,超级账本项目(Hyperledger)最初也是用来改善比特币的底层技术,最终由Linux基金会组织发展起来.       开放 ...

  5. 关于VSCode如何缩进两个空格

    使用VSCode编写vue的时候,由于缩进问题经常报错.(默认缩进4个空格,实际规范上是两个空格) 更改VSCode的缩进格式. 但是此时你在编写代码的时候却发现任然缩进4格,此时因为vscode默认 ...

  6. java中array,arrayList,iterator;

    Array        String []a = new String[10] ;  a[0] = "test" ; String []a = new String[]{&quo ...

  7. LINUX目录的意思

    Linux系统/目录下的文件夹里面分别是以下内容: /usr 包含所有的命令和程序库.文档和其他文件,还包括当前linux发行版的主要应用程序 /var 包含正在操作的文件,还有记录文件.加密文件.临 ...

  8. 史上最全的PHP正则表达式

    首先看下正则表达式思维导图: 一.校验数字的表达式  1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头 ...

  9. PostgreSQL字段名和表名大小写的问题

    创建表的时候,表名和字段名必须全小写,然后查询的时候不管全大写或全小写,或是Camel模式都不会报错.只要名称中有大写字母,或者全大写,查询时就必须保证大小写正确并用双引号包起来,否则就会报“XXX不 ...

  10. Eclipse中JS文件红叉处理

    使用新版本的Eclipse 或者 MyEclipse,项目中的 JS文件出现红叉,让人觉得项目中存在错误代码,给人的感觉很不爽. 记录一下去掉红叉的方法: 第1步: 打开工作空间中的项目找到项目的 . ...