已经开了 fread
,但仍然 TLE
。
#include<bits/stdc++.h>
using namespace std;
#define int long long
long long dp[114][11];
long long get_sum(int r)
{
if(!r)return 0;
if(r==1)return 1;
int dig=ceil(log10(r)+1e-7);
int tmp=r/(long long)pow(10,dig-1);
long long ans=0;
for(int i=0;i<tmp;i++)ans+=dp[dig][i];
return ans+tmp*(r-tmp*(long long)pow(10,dig-1)+1)+get_sum(r-tmp*(long long)pow(10,dig-1));
}
inline char nc()
{
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
char a;
a=nc();
int flag=0;
while(!isdigit(a)){if(a=='-')flag=1;a=nc();}
int n=0;
while(isdigit(a))
{
n=(n<<1)+(n<<3);
n+=(int)(a-48);
a=nc();
}
if(flag==0)return n;
else return -n;
}
inline void out(long long x)
{
if(x==0) {putchar('0');return;}
if(x<0)
{
putchar('-');
x=-x;
}
int ans=1;
int n[12]={0};
while(x)
{
n[ans]=x%10;
x/=10;
ans++;
}
for(int i=ans-1;i>=1;i--)
{
putc((n[i]+48),stdout);
}
}
signed main()
{
int l,r;
for(int i=1;i<=9;i++)
{
long long sum=0;
for(int t=0;t<=9;t++)sum+=dp[i-1][t];
for(int t=0;t<=9;t++)
{
dp[i][t]=sum+powl(10,i-1)*t;
}
}
while(l=read(),r=read())
{
if(!l&&!r)return 0;
out(get_sum(r)-get_sum(l-1));
putchar(10);
}
return 0;
}
显然复杂度是对的,而且 get_sum
函数是尾递归,应该没有多少调用影响才对,但是 TLE
。