题意:
就是求出来一个数段中不含有62的数的数量有多少?
和之前的一道题差不多,就是稍微改了一下条件就好了。
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<time.h>
using namespace std;
typedef __int64 ll;
typedef unsigned __int64 ULL;
#define pi acos(-1.0)
#define Ex exp(1.0)
#define maxn 10
int dig[maxn],vis[maxn][maxn];
ll dp[maxn][maxn];
ll go(int dep,int pre,int less){
if(dep<0) return 1;
else if(vis[dep][pre]&&less) return dp[dep][pre];
else{
if(less){
ll& tmp=dp[dep][pre];
vis[dep][pre]=1;
for(int i=0;i<10;i++){
if(i!=4){ //注意这里是i!=4
if(pre!=6||(pre==6&&i!=2)){
tmp+=go(dep-1,i,1);
}
}
}
return tmp;
}
else{
ll tmp=0;
for(int i=0;i<=dig[dep];i++){
if(i!=4){
if(pre!=6||(pre==6&&i!=2)){
tmp+=go(dep-1,i,i!=dig[dep]);
}
}
}
return tmp;
}
}
}
ll solve(ll x){
int len=0;
if(x==0) return 1;
while(x){
dig[len++]=x%10;
x=x/10;
}
return go(len-1,0,0);
}
int main(){
ll n,m;
while(~scanf("%I64d%I64d",&n,&m)){
if(n==0&&m==0) break;
if(n>m) swap(n,m);
printf("%I64d\n",solve(m)-solve(n-1));
}
#ifndef ONLINE_JUDGE
system("pause");
#endif
return 0;
}
/*
1 100
0 0
*/