求[l,r]中不含4或者62的数的个数。
数位dp计数,d[pos][st]表示在pos 位 状态为st的合法数,st为1表示上一位是6,所有若这一位是2就不能下一位的继续计数。
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
LL bits[40],d[40][2];
LL a,b;
LL dp(int pos,int st,int dif){
if(pos == 0 ) return 1;
if(dif && d[pos][st] != -1) return d[pos][st];
LL x = dif ? 9 : bits[pos];
LL ans = 0;
for(int i = 0;i <= x;i++){
if(i == 4 || (i == 2 && st == 1)) continue;
ans += dp(pos-1,i == 6,dif || i<x);
}
if(dif) d[pos][st] = ans;
return ans;
}
LL cal(LL x){
int cnt = 0;
while(x){
bits[++cnt] = x % 10;
x /= 10;
}
return dp(cnt,0,0);
}
int main(){
while(~scanf("%lld%lld",&a,&b) && a+b){
memset(d,-1,sizeof(d));
printf("%d\n",cal(b)-cal(a-1));
}
return 0;
}