const int mod=1000000007,N=25,M=410;
class Solution {
public:
int f[N][M][2];
bool check(string num,int min_sum,int max_sum){
int sum=0;
for(int i=0;i<num.size();i++){
sum+=num[i]-'0';
}
if(sum>=min_sum&&sum<=max_sum) return true;
else return false;
}
int dp(string num,int min_sum,int max_sum,int i,int sum,int free){
if(sum>max_sum) return 0;
if(sum+(num.size()-i)*9<min_sum) return 0;
if(i==num.size()) return 1;
if(f[i][sum][free]!=-1) return f[i][sum][free];
int ans=0;
int cur=num[i]-'0';
if(free==0){
for(int pick=0;pick<cur;pick++) ans=(ans+dp(num,min_sum,max_sum,i+1,sum+pick,1))%mod;
ans=(ans+dp(num,min_sum,max_sum,i+1,sum+cur,0))%mod;
}else{
for(int pick=0;pick<=9;pick++) ans=(ans+dp(num,min_sum,max_sum,i+1,sum+pick,1))%mod;
}
f[i][sum][free]=ans;
return ans;
}
int count(string num1, string num2, int min_sum, int max_sum) {
int ans=0;
memset(f,-1,sizeof f);
ans=(ans+dp(num2,min_sum,max_sum,0,0,0))%mod;
memset(f,-1,sizeof f);
ans=(ans-dp(num1,min_sum,max_sum,0,0,0)+mod)%mod;
if(check(num1,min_sum,max_sum)) ans=(ans+1)%mod;
return ans;
}
};