【入门计数类问题/数位DP模板】来自于唐老师rgnoH

模板太优秀了,对于入门的计数类问题,都不用思考,暴力定状态暴力套模板0ms轻松过
stQ 膜rgnoH 膜rgnoH Orz
样例:CQOI2015电话号码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll t1,t2,m=11,num[20],l,r,f[20][10][10][2][2][2][2];

ll Dfs(int cur,int pre,int def,int same,int eight,int four,int lim){
    if(f[cur][pre][def][same][eight][four][lim]!=-1)return f[cur][pre][def][same][eight][four][lim];
    if(cur==m+1){
        if(same&&!(eight&&four))return 1;
        return 0;
    }
    ll Ans=0;
    int t,a,b,c,d;
    t=lim?num[cur]:9;
    for(int i=(cur>1?0:1);i<=t;i++){
        if(i==pre&&i==def)a=1;else a=same;
        if(i==8)b=1;else b=eight;
        if(i==4)c=1;else c=four;
        if(lim&&i==num[cur])d=1;else d=0;
        if(!(b&&c))Ans+=Dfs(cur+1,i,pre,a,b,c,d);
    }
    return f[cur][pre][def][same][eight][four][lim]=Ans;
}

int main(){
    scanf("%lld%lld",&t1,&t2);

    memset(f,-1,sizeof(f));
    if(t1==10000000000)l=0;
    else{
        t1--;
        for(int i=1;i<=m;i++)num[m-i+1]=t1%10,t1/=10;
        l=Dfs(1,0,0,0,0,0,1);
    }

    memset(f,-1,sizeof(f));
    for(int i=1;i<=m;i++)num[m-i+1]=t2%10,t2/=10;
    r=Dfs(1,0,0,0,0,0,1);
    printf("%lld",r-l);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值