Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream fin("sumo.in");
- ofstream fout("sumo.out");
- long long nr1, nr2, r1, r2;
- unsigned long long a, b, s;
- int poz1, poz2, n;
- long long cifre[11], p=10, p10[11];
- long long numarpozitie(int poz, long long &rest)
- {
- int i;
- long long nrpozx, nrcif_dist, nrcifx, dd;
- i=1;
- while(cifre[i]<=poz)
- i++;
- nrcifx=i;
- nrcif_dist=cifre[i]-poz;
- dd=nrcif_dist/nrcifx;
- rest=nrcif_dist%nrcifx;
- nrpozx=p10[i]-1-dd;
- return nrpozx;
- }
- long long sumacifre1ton(long long nr)
- {
- if (nr<10)
- return nr*(nr+1)/2;
- int d = log10(nr);
- long long *a = new long long[d+1];
- a[0] = 0, a[1] = 45;
- for(int i=2; i<=d; i++)
- a[i] = a[i-1]*10 + 45*ceil(pow(10,i-1));
- long long pp = ceil(pow(10, d));
- long long msd = nr/pp;
- return msd*a[d] + (msd*(msd-1)/2)*pp +
- msd*(1+nr%pp) + sumacifre1ton(nr%pp);
- }
- int main()
- {
- int i;
- cifre[1]=9;
- p10[1]=1;
- for(i=2;i<=10;i++)
- {
- cifre[i]=cifre[i-1]+9*i*p;
- p10[i]=p*10;
- p*=10;
- }
- fin>>n;
- for(i=0;i<n;i++)
- {
- fin>>poz1>>poz2;
- if(poz1<10)
- nr1=poz1, r1=0;
- else
- nr1=numarpozitie(poz1, r1);
- if(poz2<10)
- nr2=poz2, r2=0;
- else
- nr2=numarpozitie(poz2,r2);
- a=sumacifre1ton(nr1-1);
- b=sumacifre1ton(nr2);
- s=b-a;
- if(nr1>9)
- {
- if(r1)
- {
- int pozx=r1+1;
- nr1=nr1/p10[pozx];
- while(nr1)
- {
- s=s-nr1%10;
- nr1/=10;
- }
- }
- else if(r1==0)
- {
- nr1=nr1/10;
- while(nr1)
- {
- s=s-nr1%10;
- nr1/=10;
- }
- }
- }
- if(nr2>9)
- {
- if(r2==1)
- s=s-nr2%10;
- else if(r2>1)
- {
- nr2=nr2%(p10[r2]);
- while(nr2)
- {
- s=s-nr2%10;
- nr2/=10;
- }
- }
- }
- fout<<s<<'\n';
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment