传送门
常规套路。
s
t
a
sta
sta记录前面一个是不是
6
6
6。
#include<bits/stdc++.h>
using namespace std;
int a[20],dp[20][2][2];
inline int dfs(int pos,int sta,int limit,int ret=0){
if(!pos) return 1;
if(~dp[pos][sta][limit]) return dp[pos][sta][limit];
int up=limit?a[pos]:9;
for(int i=0;i<=up;++i) if(i!=4){
if(sta&&i==2) continue;
ret+=dfs(pos-1,i==6,limit&&i==a[pos]);
}return dp[pos][sta][limit]=ret;
}
inline int solve(int x,int pos=0){
while(x) a[++pos]=x%10,x/=10;
memset(dp,-1,sizeof(dp));
return dfs(pos,0,1);
}
int main(){
int l,r;
while(~scanf("%d%d",&l,&r))
printf("%d\n",solve(r)-solve(l-1));
}