题意

Language:DefaultEspañol
The Counting Problem
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 5070 Accepted: 2590

Description

Given two integers a and b, we write the numbers between a and b, inclusive, in a list. Your task is to calculate the number of occurrences of each digit. For example, if a = 1024 and b = 1032, the list will be

1024 1025 1026 1027 1028 1029 1030 1031 1032

there are ten 0's in the list, ten 1's, seven 2's, three 3's, and etc.

Input

The input consists of up to 500 lines. Each line contains two numbers a and b where 0 < a, b < 100000000. The input is terminated by a line `0 0', which is not considered as part of the input.

Output

For each pair of input, output a line containing ten numbers separated by single spaces. The first number is the number of occurrences of the digit 0, the second is the number of occurrences of the digit 1, etc.

Sample Input

  1. 1 10
  2. 44 497
  3. 346 542
  4. 1199 1748
  5. 1496 1403
  6. 1004 503
  7. 1714 190
  8. 1317 854
  9. 1976 494
  10. 1001 1960
  11. 0 0

Sample Output

  1. 1 2 1 1 1 1 1 1 1 1
  2. 85 185 185 185 190 96 96 96 95 93
  3. 40 40 40 93 136 82 40 40 40 40
  4. 115 666 215 215 214 205 205 154 105 106
  5. 16 113 19 20 114 20 20 19 19 16
  6. 107 105 100 101 101 197 200 200 200 200
  7. 413 1133 503 503 503 502 502 417 402 412
  8. 196 512 186 104 87 93 97 97 142 196
  9. 398 1375 398 398 405 499 499 495 488 471
  10. 294 1256 296 296 296 296 287 286 286 247

Source

求出区间内0~9的个数

分析

参照hncu__lz的题解。

建立f(k)和f(10*k+x)的关系,也就是说对于一个大数,先处理到末尾为0,然后再认为是从0开始10个10个数数到这个数。例如,f(2984)就先从2981数到2984(2,9,8各出现4次,1,2,3,4一次)然后f(2980)可以和f(298)建立递推(实际的时候用f(297)更好一点)。注意这里需要建立一个“乘子”,一开始为1,每次递推一层就*10,然后累加到0-9的记录上。

比较巧妙的一个统计转移,详见代码。我发现要找出这类计数问题的步骤含义的最好方法就是模拟一遍。

时间复杂度\(O(\lg n)\)

代码

  1. #include<iostream>
  2. #include<cstring>
  3. #define rg register
  4. #define il inline
  5. #define co const
  6. template<class T>il T read(){
  7. rg T data=0,w=1;rg char ch=getchar();
  8. while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
  9. while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
  10. return data*w;
  11. }
  12. template<class T>il T read(rg T&x) {return x=read<T>();}
  13. typedef long long ll;
  14. using namespace std;
  15. void dfs(int n,int*f,int x){
  16. if(n<=0) return;
  17. int w=n%10+1;
  18. for(int i=1;i<w;++i) f[i]+=x; //不从0开始是方便下面第3个for循环
  19. for(int z=n/10;z;z/=10) f[z%10]+=w*x; //尾数 0到d 对应有多少高位
  20. for(int i=0;i<=9;++i) f[i]+=n/10*x; // [0,n/10) 其中末尾为0的特殊分配到n/10
  21. dfs(n/10-1,f,x*10);
  22. }
  23. int main(){
  24. for(int x,y;read(x)|read(y);){
  25. static int a[10],b[10];
  26. memset(a,0,sizeof a),memset(b,0,sizeof b);
  27. if(x>y) swap(x,y);
  28. if(--x<y) dfs(y,b,1),dfs(x,a,1);
  29. for(int i=0;i<9;++i) printf("%d ",b[i]-a[i]);
  30. printf("%d\n",b[9]-a[9]);
  31. }
  32. return 0;
  33. }

POJ2282 The Counting Problem的更多相关文章

  1. POJ2282 The Counting Problem(数位DP)

    用dp[pos][val][cnt]表示状态,pos是数位,val是当前统计的数字,cnt是目前统计的目标数字的出现次数 注意状态的转移过程,统计数字0时前导0的影响. 1 #include<c ...

  2. UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。

    /** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a] ...

  3. 『The Counting Problem 数位dp』

    The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...

  4. The Counting Problem

    The Counting Problem 询问区间\([a,b]\)中\(1\sim 9\)出现的次数,0 < a, b < 100000000. 解 显然为数位递推,考虑试填法,现在关键 ...

  5. POJ2282:The Counting Problem(数位DP)

    Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...

  6. UVa 1640 - The Counting Problem(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. UVA 1640 The Counting Problem

    https://vjudge.net/problem/UVA-1640 题意:统计区间[l,r]中0——9的出现次数 数位DP 注意删除前导0 #include<cmath> #inclu ...

  8. [POJ 2282] The Counting Problem

    [题目链接] http://poj.org/problem?id=2282 [算法] 数位DP [代码] #include <algorithm> #include <bitset& ...

  9. UVa 1640 (计数) The Counting Problem

    题意: 统计[a, b]或[b, a]中0~9这些数字各出现多少次. 分析: 这道题可以和UVa 11361比较来看. 同样是利用这样一个“模板”,进行区间的分块,加速运算. 因为这里没有前导0,所以 ...

随机推荐

  1. 用js实现promise

    /*       自定义promise         1. 执行MyPromise构造函数,要立即执行executor         2. promise实例对象,内部有三种状态          ...

  2. AR*客户地点分配OU

    DECLARE p_cust_acct_site_rec hz_cust_account_site_v2pub.cust_acct_site_rec_type; p_cust_site_use_rec ...

  3. MapReduce面试题

    什么是mapreduce Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架.容错高,扩展好,适合pB数据处理 MapReduce 执行过程分析 ...

  4. Qt 5.12 LTS 部署

    1. 拷贝release生成的exe到一个独立的目录deploy 2. windeployqt.exe A_Toolkit.exe 3. 将qt\qt5.12.5\tool\mingw730_64\b ...

  5. authenticate的执行流程与重写

    流程 1.authenticate调用的是_get_backends函数 def authenticate(request=None, **credentials): for backend, bac ...

  6. DS 壹之型 头指针与头结点

    之前结合网上博客整理的笔记,希望能帮你解除疑惑!    

  7. SAS学习笔记61 set和union的区别

    好久没发博客了,水一篇,直接来代码 set的结果如下 union的结果如下

  8. dubbo线程池的拒绝策略

    jdk自带的原生的拒绝策略抛出的异常信息不够详细,而dubbo对拒绝策略进行了改写,抛出的信息更具有参考价值,值得我们借鉴. jdk自带的原生拒绝策略抛出的信息: // ThreadPoolExecu ...

  9. CCF 2016-12-1 工资计算

    CCF 2016-12-1 工资计算 题目 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交 ...

  10. SharePoint中用Power shell命令设置文档库列表的权限

    首先停止继承权限 $web = Get-PnPweb $spoList= Get-PnPList "Testlist" -Web $web (注释:获取对象)$spoList.Br ...