「 HDU P2089 」 不要62

和 HDOJ 3555 一样啊,只不过需要多判断个 ‘4’

我有写 3555 直接去看那篇吧

这里只放代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m, num[15], dp[15][2];
inline int dfs(int l, bool flag, bool limit) {
    if(l == 0) return 1;
    if(!limit && dp[l][flag]) return dp[l][flag];
    int ans = 0, mx = (limit ? num[l] : 9);
    for(int i=0; i<=mx; i++) {
        if(i == 4) continue;
        if(flag && i == 2) continue;
        ans += dfs(l-1, i == 6, limit && i == mx);
    }
    return limit ? ans : dp[l][flag] = ans;
}
inline int solve(int x) {
    memset(num, 0, sizeof(num));
    int k = 0;
    while (x != 0) {
        num[++k] = x % 10;
        x /= 10;
    }
    return dfs(k, false, true);
}
int main() {
    while (scanf("%d%d", &n, &m) == 2) {
        if(n == 0 && m == 0) break;
        printf("%d
", solve(m)-solve(n-1)); 
    }
    return 0;
}
原文地址:https://www.cnblogs.com/bljfy/p/9615289.html