一个数位DP原题
本地和在线IDE都没有问题,为什么交上SP就CE了
远端OJ尚未返回编译信息。
本地开了四个警告的编译命令只有快读快写的警告。
#include<bits/stdc++.h>
using namespace std;
#define ri register int
#define ll long long
#define p 10000000070000007
#define MAXN 51
#define int long long
ll pow10[MAXN],dp[MAXN],a[MAXN],cnt[MAXN],tc[MAXN],ans1;
template< typename T >inline void read(T &x)
{
char c=getchar();
x=0;
int f=0;
for(; !isdigit(c); c=getchar()) f|=(c=='-');
for(; isdigit(c); c=getchar()) x=((x<<3)+(x<<1)+(c^48));
x=f?-x:x;
}
template< typename T >inline void write(T x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10^48);
}
inline void pre()
{
pow10[0]=1;
for(ri i=1;i<30;i++) dp[i]=(dp[i-1]*10%p+pow10[i-1])%p,pow10[i]=10*pow10[i-1]%p;
}
inline void sol(ll x)
{
int len=0;
while(x)
{
a[++len]=x%10;
x/=10;
}
for(ri i=len;i>=1;i--)
{
for(ri j=0;j<10;j++)
{
cnt[j]+=dp[i-1]*a[i];
cnt[j]%=p;
}
for(ri j=0;j<a[i];j++)
{
cnt[j]+=pow10[i-1];
cnt[j]%=p;
}
ll last=0;
for(ri j=i-1;j>=1;j--)
{
last=last*10+a[j];
last%=p;
}
cnt[a[i]]+=last+1;
cnt[a[i]]%=p;
cnt[0]-=pow10[i-1];
cnt[0]=(cnt[0]+p)%p;
}
}
signed main()
{
pre();
int T,l,r;
read(T);
while(T--)
{
ans1=0;
read(l);read(r);
sol(r);
for(ri i=0;i<10;i++) tc[i]=cnt[i],cnt[i]=0;
sol(l-1);
for(ri i=0;i<10;i++) ans1=(ans1+i*(tc[i]-cnt[i]+p)%p)%p,cnt[i]=0;
write(ans1);
putchar('\n');
}
}