SDUT 3904 C~K的幸运数字(数位DP)

Problem Description

据说,QAQ 的幸运数字是含有 "47" (4 和 7 相邻)的数,例如 47, 147, 247, 470, 471, 2047 是他的幸运数字,而 74, 1234, 407 就不是他的幸运数字。

而对 C~K 来说,只要不是 QAQ 的幸运数字的数都是他的幸运数字。那么他想问你,在闭区间 [l, r] 中,有多少个自己的幸运数字?

Input

输入数据有多组。第 1 行输入 1 个整数 T (1 <= T <= 10000) 表示数据组数。

对于每组数据,输入 1 行,包含 2 个整数 l, r (1 <= l <= r < 10^9),表示 C~K 要询问的区间。

Output

对于每组数据,在 1 行中输出 1 个整数,表示区间内 C~K 的幸运数字的个数。

Example Input
3
1 1
10 50
1 500
Example Output
1
40
485
// 裸数位dp的一道题, 感觉数位dp不是我等小辈所能讲的懂的, 不如直接奉上代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <istream>
using namespace std;
#define N 20
int bit[20];
int dp[20][2];

int dfs(int pos, bool is4, bool islimited)
{
    if(pos == -1)
        return 1;
    if(!islimited && dp[pos][is4])
        return dp[pos][is4];
    int end = islimited ? bit[pos] : 9;
    int ans = 0;
    for(int i = 0; i <= end; i++)
    {
        if(is4 && i == 7)
            continue;
        ans += dfs(pos- 1, i == 4, islimited && i == end);
    }
    if(!islimited)
    {
        dp[pos][is4] = ans;
    }
    return ans;
}
int solve(int n)
{
    int l = 0;
    while(n)
    {
        bit[l++] = n % 10;
        n /= 10;
    }
    return dfs(l - 1, false, true);
}
int main()
{
    int left;
    int right;
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d %d", &left, &right);
        printf("%d\n", solve(right) - solve(left - 1));
    }
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值