记录编号 188050 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]计数问题 最终得分 100
用户昵称 GravatarSkyo 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2015-09-21 19:40:57 内存使用 0.31 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. typedef long long L;
  5. using namespace std;
  6.  
  7. L a, b, c, _10[15], ans[15], f[15][15][15];
  8. bool flag;
  9.  
  10. void get_f(){
  11. _10[0] = 1;
  12. for(int i = 1; i < 15; i++) _10[i] = _10[i-1]*10;
  13. for(int i = 1; i < 10; i++) f[i][1][i] = 1;
  14. for(int i = 1; i < 10; i++)
  15. for(int j = 2; j < 15; j++){
  16. f[i][j][1] = _10[j-2]*(j-1);
  17. for(int k = 2; k < 10; k++)
  18. f[i][j][k] = f[i][j][1];
  19. }
  20. for(int i = 1; i < 10; i++)
  21. for(int j = 2; j < 15; j++){
  22. f[i][j][i] += _10[j-1];
  23. }
  24. }
  25.  
  26. void get_all(){
  27. int la = 0, lb = 0;
  28. L ta = a-1, tb = b, all = 0;
  29. while(ta){
  30. la++, ta /= 10;
  31. }
  32. while(tb){
  33. lb++, tb /= 10;
  34. }
  35. for(int i = la; i < lb; i++){
  36. all += (_10[i]-_10[i-1])*i;
  37. } all += (b-_10[lb-1]+1)*lb;
  38. all -= (a-_10[la-1])*la;
  39. ans[0] = all;
  40. }
  41.  
  42. L d(L k, int i){
  43. if(!k) return 0;
  44. int fir, len = 0;
  45. L t = k, res = 0;
  46. while(t){
  47. len++, t /= 10;
  48. } fir = k / _10[len-1];
  49. if(len == 1) return i <= k;
  50. for(int j = 1; j < fir; j++){
  51. res += f[j][len][i];
  52. }
  53. res += d(k%_10[len-1], i) + d(_10[len-1]-1, i) + (fir==i)*(k%_10[len-1]+1);
  54. return res;
  55. }
  56.  
  57. int main()
  58. {
  59. freopen("count2013.in", "r", stdin);
  60. freopen("count2013.out", "w", stdout);
  61. scanf("%lld %lld", &b, &c);
  62. a = 1;
  63. get_f();
  64. get_all();
  65. for(int i = 1; i < 10; i++){
  66. ans[i] = d(b, i) - d(a-1, i);
  67. ans[0] -= ans[i];
  68. }
  69. printf("%lld ", ans[c]);
  70. return 0;
  71. }