AtCoder Beginner Contest 208 E

E - Digit Products

点击查看代码
map<int,int>f[20];

void solve(){
    int n,k;cin>>n>>k;
    auto s=to_string(n);
    int m=s.size();
    function<int(int,int,int,int)>dfs=[&](int i,int limit,int is_num,int mul)->int{
        if(i==m)return mul<=k;
        if(!limit&&is_num&&f[i].count(mul))return f[i][mul];;
        int up=limit?(s[i]-'0'):9;
        int res=0;
        for(int d=0;d<=up;d++){
            int tmp;
            if(!is_num&&d==0)tmp=mul;
            else if(!is_num&&d)tmp=d;
            else tmp=mul*d;
            res+=dfs(i+1,limit&&d==up,is_num||d!=0,tmp);
        }
        if(!limit&&is_num)f[i][mul]=res;
        return res;
    };
    cout<<dfs(0,1,0,0)-1;
}
posted @ 2024-04-28 17:35  archer2333  阅读(18)  评论(0)    收藏  举报