被神秘卡常求助
查看原帖
被神秘卡常求助
1076971
anke2017楼主2025/1/25 10:06

已经开了 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

2025/1/25 10:06
加载中...