数位dp板子

链接:https://www.luogu.com.cn/problem/P2602

int len;
int f[15][15];
int a[15];
int ans=0;
int dfs(int pos,int lead,int limit,int sum,int d){
    if(pos>len)return sum;
    if(!limit&&f[pos][sum]!=-1)return f[pos][sum];
    int res=0;
    int up=limit?a[len-pos+1]:9;
    for(int i=0;i<=up;i++){
        if(lead&&i==0){
            res+=dfs(pos+1,1,0,sum,d);
        }
        else{
            if(i==d){
                res+=dfs(pos+1,0,limit&&i==up,sum+1,d);
            }else{
                res+=dfs(pos+1,0,limit&&i==up,sum,d);
            }
        }
    }
    if(!limit&&!lead)f[pos][sum]=res;

    return res;
}
void part(int x,int d){
    len=0;ans=0;
    memset(f,-1,sizeof f);
    while(x){
        a[++len]=x%10;x/=10;
    }
    ans=dfs(1,1,1,0,d);
}

void solve(){
    int a,b;cin>>a>>b;
    for(int i=0;i<10;i++){
        int mx,mn;
        part(a-1,i);mn=ans;
        part(b,i);mx=ans;
        cout<<(mx-mn)<<' ';
    }
}
posted @ 2025-05-19 14:57  Marinaco  阅读(19)  评论(0)    收藏  举报
//雪花飘落效果