数位dp的基础题,复习模板用!!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll f[20][200],a[20];
ll dfs(int x,int sum,int top)
{
if(!x) return sum;
if(!top && f[x][sum]>=0) return f[x][sum];
int up=9; if(top) up=a[x];
ll res=0;
for(int i=0;i<=up;i++)
res=(res+dfs(x-1,i+sum,top&&(i==up)))%mod;
if(!top) f[x][sum]=res;
return res;
}
ll calc(ll x)
{
int sum=0;
while(x)
{
a[++sum]=x%10;
x/=10;
}
return dfs(sum,0,1)%mod;
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int t;ll x,y;
scanf("%d",&t);
memset(f,-1,sizeof(f));
while(t--)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",(calc(y)-calc(x-1)+mod)%mod);
}
return 0;
}