题意:给你整数a、b,问你[a,b]间每个数字分解成单个数字后,0、1、2、3、4、5、6、7、8、9,分别有多少个

题解:首先找到[0,b]与[0,a-1]进行区间减法,接着就只是求[0,x]

   对于x首先求出他有几位、接着从高位到低位求每个区间

   例如x=15602,则依次求出[1,9],[10,99],[100,999],[1000,9999],这个注意因为没有前导0,所以1-9是一样多的0要少一些

   接着再求[10000,10999],[11000,11999],[12000,12999],[13000,13999],[14000,14999],[15000,15099]..........[15500,15599]

   注意在这儿需求前导0,最后对于个位数的几个进行遍历就好了

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<iomanip>
  11. #include<stdlib.h>
  12. #include<iostream>
  13. #include<algorithm>
  14. using namespace std;
  15. #define eps 1E-8
  16. /*注意可能会有输出-0.000*/
  17. #define sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
  18. #define cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
  19. #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
  20. #define mul(a,b) (a<<b)
  21. #define dir(a,b) (a>>b)
  22. typedef long long ll;
  23. typedef unsigned long long ull;
  24. const int Inf=<<;
  25. const ll INF=1LL<<;
  26. const double Pi=acos(-1.0);
  27. const int Mod=1e9+;
  28. const int Max=;
  29. int Dig[]= {,,,,,,,,,}; //1-9 10-99 100-999的总个数
  30. int makeup[]= {,,,,,,,,,}; //补全1-9并减去0
  31. int dp1[];//[0,a-1]中0到9的个数
  32. int dp2[];//[0,b]中0到9的个数
  33. void Everyno(int k,int *dp)//计算有k位的dp,例如k=2就是 10-99,不补前导0
  34. {
  35. int num=Dig[k-]*k;
  36. for(int i=; i<; ++i)
  37. {
  38. if(!i)
  39. dp[i]=dp[i]+num-makeup[k-]*;//减去一些0不可能出现的地方
  40. else
  41. dp[i]=dp[i]+num+makeup[k-];
  42. }
  43. }
  44. void Everyyes(int k,int *dp)
  45. {
  46. int num=makeup[k]*k;
  47. for(int i=;i<;++i)
  48. {
  49. dp[i]+=num;
  50. }
  51. }
  52. void Solve(int a,int* dp)//[0,a]中0到9的个数
  53. {
  54. for(int i=; i<; ++i)
  55. dp[i]=;
  56. int enn=;
  57. int dig=;//位数
  58. while(enn<=a)//计算 1-9 10-99 100-999...除开0以外,每位个数都相同且平分差值
  59. {
  60. Everyno(dig,dp);
  61. dig++;
  62. enn=enn*+;
  63. }
  64.  
  65. enn=enn/+;
  66. while(enn<=a)//剩下的数
  67. {
  68. dig=;
  69. while(enn+Dig[dig+]<=a)//例如求1899时 现在为1000,则需要使enn=1099
  70. {
  71. dig++;
  72. enn+=Dig[dig];
  73. }
  74. if(!dig)
  75. break;
  76. Everyyes(dig,dp);
  77. int temp=enn,temp2=dig;
  78. while(temp2--)
  79. temp/=;
  80. while(temp)//补上前面的数,例如求1899在使用1000-1099时需要补上1与0的100个
  81. {
  82. dp[temp%]+=makeup[dig+];
  83. temp/=;
  84. }
  85. enn++;
  86. }
  87. if(enn==)
  88. enn--;
  89. while(enn<=a)//剩下个位几个
  90. {
  91. int temp=enn;
  92. if(temp==)
  93. dp[]++;
  94. while(temp)
  95. {
  96. dp[temp%]++;
  97. temp/=;
  98. }
  99. enn++;
  100. }
  101. return ;
  102. }
  103. int main()
  104. {
  105. int a,b;
  106. while(~scanf("%d %d",&a,&b)&&(a+b))
  107. {
  108. if(a>b)
  109. swap(a,b);
  110. Solve(a-,dp1);
  111. Solve(b,dp2);
  112. for(int i=; i<; ++i)
  113. printf("%d%c",dp2[i]-dp1[i],i==?'\n':' ');
  114. }
  115. return ;
  116. }

  

 其实还有更简单的方法:从后到前枚举每一个位置可能出现没一个值的个数,这儿可以通过打表找到一些规律

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<vector>
  7. #include<stdlib.h>
  8. #include<string>
  9. #include<cstdio>
  10. #include<cstring>
  11. #include<iostream>
  12. #include<algorithm>
  13. using namespace std;
  14. #define eps 1E-8
  15. /*注意可能会有输出-0.000*/
  16. #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
  17. #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
  18. #define mul(a,b) (a<<b)
  19. #define dir(a,b) (a>>b)
  20. typedef long long ll;
  21. const int Inf=0x3f3f3f3f;
  22. const double Pi=acos(-1.0);
  23. const int Max=;
  24. ll Dp(ll n,int m)
  25. {
  26. ll num=,k,l;
  27. if(!m)//0出现的次数是特殊的
  28. {
  29. k=,l=;
  30. while(l<n)
  31. {
  32. num+=((n-k)/(l*)*l);
  33. //printf("%lld %lld %lld\n",num,l,n);
  34. k=k*+;
  35. if((n-k)%(l*)<=(k/)&&(n-k)%(l*)>)
  36. num+=((n-k)%(l*));
  37. l*=;
  38. }
  39. }
  40. else//1-9出现的次数求法一致
  41. {
  42. k=;
  43. l=m;
  44. while(n>=l)//从低到高枚举每一位
  45. {
  46. num+=(n-l)/(k*)*k+min(k,(n-l)%(k*)+);
  47. k*=;
  48. l*=;
  49. }
  50. }
  51. return num;
  52. }
  53. int main()
  54. {
  55. ll n,m;
  56. while(~scanf("%lld %lld",&n,&m)&&(n+m))
  57. {
  58. if(n>m)
  59. swap(n,m);
  60. for(int i=;i<;i++)
  61. {
  62. printf("%lld%c",Dp(m,i)-Dp(n-,i),i==?'\n':' ');//枚举每个数
  63. }
  64. }
  65. return ;
  66. }

UVA 1640 The Counting Problem(按位dp)的更多相关文章

  1. 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] ...

  2. UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)

    题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...

  3. UVA - 1640 The Counting Problem (数位dp)

    题意:统计l-r中每种数字出现的次数 很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊) 从高位向低位走,设状态$(u,lim,ze)$表示 ...

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

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

  5. UVA 1640 The Counting Problem

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

  6. UVa 1640 The Counting Problem (数学,区间计数)

    题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从 ...

  7. POJ2282 The Counting Problem(数位DP)

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

  8. 『The Counting Problem 数位dp』

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

  9. 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem

     UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...

随机推荐

  1. dubbo zookeeper报错failed to connect to server , error message is:No route to host

    failed to connect to server , error message is:No route to host 转自:http://blog.csdn.net/miaohongyu1/ ...

  2. XXE(xml外部实体注入漏洞)

    实验内容 介绍XXE漏洞的触发方式和利用方法,简单介绍XXE漏洞的修复. 影响版本: libxml2.8.0版本 漏洞介绍 XXE Injection即XML External Entity Inje ...

  3. python基础-第十三篇-13.2Web框架之Tornado

    Tornado是非阻塞异步web frame,而且速度相当快,得力于其非阻塞的方式和对epoll的运用 Tornado每秒可以处理数以千计的链接,所以它可以有效的处理C10K问题 下载安装 pip3 ...

  4. sklearn.svm包中的SVC(kernel=”linear“)和LinearSVC的区别

    参考:https://stackoverflow.com/questions/45384185/what-is-the-difference-between-linearsvc-and-svckern ...

  5. SQL 时间函数 Datepart()与DateName()

    1.Datepart() 返回代表指定日期的指定日期部分的整数 语法 Datepart(datepart,date) 返回类型 int datepart: 日期部分 缩写 year yy, yyyy ...

  6. tagName()方法详解

    1.该方法可以通过元素的标签名称来查找元素.这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用: driver.findElement(By.xpath(&quo ...

  7. 这些Python骚操作,你知道吗?

    0x00 世界,你好 ​程序员第一次接触语言或者框架,基本上都有个 Hello World 的例子,这里 Python 直接将它做成了一个包. 0x01 Python 哲学 ​ Python 执行 i ...

  8. 3个Activity间的切换

    package com.yarin.android.Examples_03_01; import android.app.Activity; import android.content.Intent ...

  9. lamp中的Oracle数据库链接

    lamp一键安装包: https://lnmp.org/install.html 在CentOS 6.7 64位安装PHP的PDO_OCI扩展 Installing PDO_OCI extension ...

  10. Xcode 错误问题以及解决方法(后期遇到还会添加)

    1,/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhon ...