牢大数(see you again)

  • 传统题  1000ms  512MiB
  • 说明

    科比·布莱恩特(Kobe Bryant,1978年8月23日—2020年1月26日),全名科比·比恩·布莱恩特·考克斯(Kobe Bean Bryant Cox),出生于美国宾夕法尼亚州费城,美国已故篮球运动员,司职得分后卫/小前锋。他在打篮球时穿的球服号码为8与24,于是我们称含有8或24的数称为牢大数。温馨提示:不要在半夜打这道题代码,你会被牢大肘击

    输入格式

    输入的都是整数对 n,m,每次输入只输入一行。

    输出格式

    对于每个整数对,输出一个不含有8或24数字的统计个数,该数值占一行位置。

    样例

    输入数据 1

    1 1000

    输出数据 1

    289

     输入数据 2

    8 242424

    输出数据 2

    105540

  • 提示


    数据范围:对于全部数据,0<n≤m<10^{7}。、
  • #include <bits/stdc++.h>
    using namespace std;
    const int N=2e5+7;
    int n,m,a[N];
    int f[4000][200];
    int dfs(int pos,int six,int lit) {
        if(pos<=0) return 1;
        if(f[pos][six]>0&&!lit) return f[pos][six];
        int ans=0,p=9;if(lit)p=a[pos];
        for(int i=0;i<=p;++i)
    	{
    		if(i==8) continue;
            if(six&&i==4) continue;
            ans+=dfs(pos-1,i==2,lit&&i==p);
        }
        if(!lit)
        f[pos][six]=ans;
        return ans;
    }
    int solve(int x)
    {
        if(x<0) return 0;
        memset(f,-1,sizeof(f));
        memset(a,0,sizeof(a));
        int cnt=0;
        while(x)
    	{
            a[++cnt]=x%10;
            x/=10;
        }
        return dfs(cnt,0,1);
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {	if(!n&&!m) break;
        	printf("%lld\n",m-n+1-solve(m)+solve(n-1));
    	}
        return 0;
    }

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值