数位DP板子记得不清不楚,我自我检讨一下…今晚的CF就明天再补了
https://www.luogu.com.cn/problem/P2602
F[pos][cnt]表示将数字分解后从高位向低位枚举的第i位,区域数字中出现cnt次指定位数字的情况
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 16;
int f[N][N],power[N];
int a[N],x,y,idx;
int dp(int pos,int cnt,int x,int lead,int flag){
if(pos==0) return cnt;
if(flag&&(!lead)&&f[pos][cnt]!=-1) return f[pos][cnt];
int k = flag?9:a[pos];
int ans=0;
for(int i=0;i<=k;i++){
if(lead&&i==0) ans+=dp(pos-1,cnt,x,lead,flag||i<k);
else ans+=dp(pos-1,cnt+(i==x),x,0,flag||i<k);
}
if(flag && !lead) f[pos][cnt] = ans;
return ans;
}
int solve(int x,int num){
memset(f,-1,sizeof f);
idx=0;
while(x) a[++idx] = x%10,x/=10;
return dp(idx,0,num,1,0);
}
signed main(){
scanf("%lld%lld",&x,&y);
for(int i=0;i<10;i++){
printf("%lld ",solve(y,i)-solve(x-1,i));
}
return 0;
}