题目大意:一个数x各个数位上的数之积记为f(x),不含前导零
求
[L,R)
中满足
0<f(x)≤n
的数的个数
题解:R是开区间!!!我因为这个调了很长时间……
随便数位dp一下,
f[i][j]
表示
i
位乘积为
第二维很大,但是考虑到取值很少,直接map
我的收获:orz
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
#define ll long long
ll n,l,r;
int bit[25];
map<ll,ll> f[25];
ll dfs(int x,ll now,bool p,bool e){
if(now>n||!now) return 0;
if(!x) return 1;
if(!e&&f[x][now]) return f[x][now];
ll ret=0,u=e?bit[x]:9;
for(int i=0;i<=u;i++){
if(p&&!i) ret+=dfs(x-1,now,p&&!i,e&&i==u);//特判前导0
else ret+=dfs(x-1,now*i,p&&!i,e&&i==u);
}
return !e&&!p?f[x][now]=ret:ret;//注意写!p
}
ll calc(ll x)
{
for(int i=0;i<25;i++) f[i].clear();
int len=0;
while(x) bit[++len]=x%10,x/=10;
return dfs(len,1,1,1);
}
void init(){
cin>>n>>l>>r;r--;
printf("%lld\n",calc(r)-calc(l-1));
}
int main()
{
init();
return 0;
}