在递归的时候设置一个前导位lead,只有lead不为0的时候才可以进行记忆化,搜索等操作
其余的没什么可以说的
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
//#define double long long
#define re int
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod=1e9+7;
//const int inf=1e18;
const int M=1e8;
const int N=1e6+5;//??????.???? 4e8
int a[N],b[N];
int f[55][55];
int t;
int dfs(int p,int state,bool lim,int pos,bool lead)
{
if(p<=0) return state;
if(f[p][state]!=-1&&!lim&&lead) return f[p][state];
int up=lim?b[p]:9;
int ans=0;
for(re i=0;i<=up;i++)
{
if(i==pos&&(i||lead)) ans+=dfs(p-1,state+1,lim&&i==up,pos,lead||i);
else ans+=dfs(p-1,state,lim&&i==up,pos,lead||i);
}
if(!lim&&f[p][state]==-1&&lead) f[p][state]=ans;
return ans;
}
int divide(int x,int pos)
{
t=0;
while(x)
{
b[++t]=x%10;
x/=10;
}
memset(f,-1,sizeof(f));
return dfs(t,0,1,pos,0);
}
void solve()
{
int l,r;
cin>>l>>r;
for(re i=0;i<=9;i++) a[i]=divide(r,i)-divide(l-1,i);
for(re i=0;i<=9;i++) printf("%lld ",a[i]);
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
/*
*/