fork download
  1. #include<stdio.h>
  2. int dsum[10][10];
  3. long long int precomp[8]={45,900,13500,180000,2250000,27000000,315000000,3600000000};
  4. long long int func(int start,int end){
  5. if ((start==0&&((end+1)%10==0))) return precomp[digitsin(end)-1];
  6. if (start==end) return digsum(start);
  7. if (start > end) return 0;
  8. int d = digitsin(end);
  9. if (d==1) return dsum[start][end];
  10. long long int sum =0;
  11. int fs = first(start,d);
  12. int fe = first(end,d);
  13. int e1 = (fs+1)*(int)power((int)(10),(int)(d-1));
  14. int os = otf(start,d);
  15. int oe = otf(end,d);
  16. int oee = otf((e1-1),d);
  17. if (fs!=fe){
  18. sum+=(fs*(e1-start));
  19. sum+=(func(os,oee));
  20. }
  21. else{
  22. sum+=((end-start+1)*fs);
  23. sum+=func(os,oe);
  24. }
  25. sum+=func(e1,end);
  26. return sum;
  27. }
  28.  
  29. int main(){
  30. init();
  31. int a,b;
  32. scanf("%d%d",&a,&b);
  33. if (a==-1&&b==-1) exit(0);
  34. printf("%lld\n",func(a,b));
  35. main();
  36. return 0;
  37. }
  38.  
  39. int digitsin(int n){
  40. int d=0;
  41. while (n){
  42. n/=10;
  43. d++;
  44. }
  45. return d;
  46. }
  47.  
  48. int first(int n,int d){
  49. return (n/power(10,d-1));
  50. }
  51.  
  52. int otf(int n,int d){
  53. return (n%(int)power((int)10,(int)(d-1)));
  54. }
  55.  
  56. int init(){
  57. int i,j;
  58. int sum;
  59. for (i=0;i<10;i++){
  60. sum = 0;
  61. for (j=i;j<10;j++){
  62. sum+=j;
  63. dsum[i][j] = sum;
  64. }
  65. }
  66. return 0;
  67. }
  68.  
  69. int digsum(int n){
  70. int sum = 0;
  71. while (n){
  72. sum+=(n%10);
  73. n/=10;
  74. }
  75. return sum;
  76. }
  77.  
  78. int power(int a,int b){
  79. int i,res=1;
  80. for (i=0;i<b;i++){
  81. res*=a;
  82. }
  83. return res;
  84. }
  85.  
Success #stdin #stdout 0s 2012KB
stdin
5 243 
-1 -1
stdout
2240