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;
}