题目大意
求 [ l , r ] [l,r] [l,r] 内 0 ∼ 9 0\sim9 0∼9 出现的次数
思路
这道题是数位DP模板题,判一下前导0即可。
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long c[100010],f[100010][20];
long long l,r;
long long dfs(long long pos,long long lend,long long sum,long long limit,long long x)
{
//lend判前导0
if(pos==0)
return sum;
if(!limit&&!lend&&f[pos][sum]!=-1)
return f[pos][sum];
long long s=(!limit)?9:c[pos],js=0;
for(long long i=0; i<=s; i++)
js+=dfs(pos-1,lend&&i==0,sum+((!lend||i)&&(i==x)),limit&&i==s,x);
if(!limit&&!lend)
f[pos][sum]=js;
return js;
}
long long solve(long long x,long long d)
{
long long tot=0;
while(x)
{
c[++tot]=x%10;
x/=10;
}
return dfs(tot,1,0,1,d);
}
int main()
{
scanf("%lld%lld",&l,&r);
for(long long i=0; i<=9; i++)
{
memset(f,-1,sizeof(f));
printf("%lld ",solve(r,i)-solve(l-1,i));
}
return 0;
}