a53

sumo

a53
Aug 13th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("sumo.in");
  6. ofstream fout("sumo.out");
  7.  
  8. long long nr1, nr2, r1, r2;
  9. unsigned long long a, b, s;
  10. int poz1, poz2, n;
  11. long long cifre[11], p=10, p10[11];
  12.  
  13. long long numarpozitie(int poz, long long &rest)
  14. {
  15. int i;
  16. long long nrpozx, nrcif_dist, nrcifx, dd;
  17. i=1;
  18. while(cifre[i]<=poz)
  19. i++;
  20. nrcifx=i;
  21. nrcif_dist=cifre[i]-poz;
  22. dd=nrcif_dist/nrcifx;
  23. rest=nrcif_dist%nrcifx;
  24. nrpozx=p10[i]-1-dd;
  25. return nrpozx;
  26. }
  27.  
  28. long long sumacifre1ton(long long nr)
  29. {
  30. if (nr<10)
  31. return nr*(nr+1)/2;
  32. int d = log10(nr);
  33. long long *a = new long long[d+1];
  34. a[0] = 0, a[1] = 45;
  35. for(int i=2; i<=d; i++)
  36. a[i] = a[i-1]*10 + 45*ceil(pow(10,i-1));
  37. long long pp = ceil(pow(10, d));
  38. long long msd = nr/pp;
  39. return msd*a[d] + (msd*(msd-1)/2)*pp +
  40. msd*(1+nr%pp) + sumacifre1ton(nr%pp);
  41. }
  42. int main()
  43. {
  44. int i;
  45. cifre[1]=9;
  46. p10[1]=1;
  47. for(i=2;i<=10;i++)
  48. {
  49. cifre[i]=cifre[i-1]+9*i*p;
  50. p10[i]=p*10;
  51. p*=10;
  52. }
  53. fin>>n;
  54. for(i=0;i<n;i++)
  55. {
  56. fin>>poz1>>poz2;
  57. if(poz1<10)
  58. nr1=poz1, r1=0;
  59. else
  60. nr1=numarpozitie(poz1, r1);
  61. if(poz2<10)
  62. nr2=poz2, r2=0;
  63. else
  64. nr2=numarpozitie(poz2,r2);
  65. a=sumacifre1ton(nr1-1);
  66. b=sumacifre1ton(nr2);
  67. s=b-a;
  68. if(nr1>9)
  69. {
  70. if(r1)
  71. {
  72. int pozx=r1+1;
  73. nr1=nr1/p10[pozx];
  74. while(nr1)
  75. {
  76. s=s-nr1%10;
  77. nr1/=10;
  78. }
  79. }
  80. else if(r1==0)
  81. {
  82. nr1=nr1/10;
  83. while(nr1)
  84. {
  85. s=s-nr1%10;
  86. nr1/=10;
  87. }
  88. }
  89.  
  90. }
  91. if(nr2>9)
  92. {
  93. if(r2==1)
  94. s=s-nr2%10;
  95. else if(r2>1)
  96. {
  97. nr2=nr2%(p10[r2]);
  98. while(nr2)
  99. {
  100. s=s-nr2%10;
  101. nr2/=10;
  102. }
  103. }
  104. }
  105. fout<<s<<'\n';
  106. }
  107. return 0;
  108. }
Add Comment
Please, Sign In to add comment