题目描述
输入格式
输出格式
输入输出样例
输入样例
1 99
输出样例
9 20 20 20 20 20 20 20 20 20
说明/提示
数据规模与约定
分析
很裸的一道数位DP的板子
定义f[当前枚举到的数位][当前数位之前的答案][枚举的数字]
其它的套板子就可以了,要注意一下前缀0的判断
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<queue> 6 #include<cmath> 7 using namespace std; 8 typedef long long ll; 9 ll f[20][20][20],num[30]; 10 ll a,b; 11 ll asd(ll now,ll tot,ll ask,ll jud,ll zer){ 12 if(now<0){ 13 return tot; 14 } 15 if(f[now][tot][ask]!=-1 && jud==0 &&(ask || !zer)){ 16 return f[now][tot][ask]; 17 } 18 ll mmax=9; 19 if(jud==1) mmax=num[now]; 20 ll anss=0; 21 for(ll i=0;i<=mmax;i++){ 22 anss+=asd(now-1,tot+( (i==ask) & (!zer || i)),ask,jud&(i==mmax),zer&(i==0)); 23 } 24 if(!jud && (ask || !zer)) f[now][tot][ask]=anss; 25 return anss; 26 } 27 ll solve(ll xx,ll ask){ 28 ll cnt=0; 29 memset(num,0,sizeof(num)); 30 while(xx){ 31 ll aa=xx%10; 32 num[cnt++]=aa; 33 xx/=10; 34 } 35 return asd(cnt-1,0,ask,1,1); 36 } 37 int main(){ 38 memset(f,-1,sizeof(f)); 39 scanf("%lld%lld",&a,&b); 40 for(ll i=0;i<=9;i++){ 41 ll ans=solve(b,i)-solve(a-1,i); 42 printf("%lld ",ans); 43 } 44 printf(" "); 45 return 0; 46 }