题目地址
配套地址
考虑记忆化搜索的状态,设dp(i,j,k)表示处理到第i位,且上一位为j,当前是否合法为k。
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int N = 20;
const int mod = 10007;
vector<int> s;
int dp[N][N][2];
int l,r;
int dfs(int n,int lead,int op,int last,int ok){
if(!n) return !ok;
if(!lead && !op && ~dp[n][last][ok]) return dp[n][last][ok];
int up = op ? s[n] : 9;
int res = 0;
for(int i=0;i<=up;i++)
res += dfs(n-1,lead & (i == 0),op & (i == up),i,ok | (i == 4 || (last==6 && i == 2)));
if(!lead && !op) dp[n][last][ok] = res;
return res;
}
int slove(int x){
memset(dp,-1,sizeof(dp));
s.clear();
s.push_back(-1);
while(x) s.push_back(x%10),x /= 10;
return dfs((int)s.size()-1,1,1,-1,0);
}
signed main(){
IOS
while(cin>>l>>r && r && l) cout<<slove(r) - slove(l-1)<<endl;
return 0;
}