前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Luogu P4124 [CQOI2016]手机号码 题解

Luogu P4124 [CQOI2016]手机号码 题解

作者头像
yzxoi
发布2022-09-19 12:52:55
4120
发布2022-09-19 12:52:55
举报
文章被收录于专栏:OI

Luogu P4124 [CQOI2016]手机号码 题解

Describe

题目链接

人们选择手机号码时都希望号码好记、吉利。比如号码中含有几位相邻的相同数字、不含谐音不吉利的数字等。手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出售。为了便于前期规划,运营商希望开发一个工具来自动统计号段中满足特征的号码数量。 工具需要检测的号码特征有两个:号码中要出现至少 3 个相邻的相同数字;号码中不能同时出现 84。号码必须同时包含两个特征才满足条件。满足条件的号码例如:13000988721、23333333333、14444101000。而不满足条件的号码例如:1015400080、10010012022。 手机号码一定是 11 位数,前不含前导的 0。工具接收两个数 LR,自动统计出 [L,R] 区间内所有满足条件的号码数量。LR 也是 11 位的手机号码。

Solution

数位dp 注意细节

Code

代码语言:javascript
复制
#include<bits/stdc++.h>
#define int long long 
using namespace std;
int a[15],m,f[15][10][10][2][2][2][2][2];
inline int DFS(int x,int las,int lasqr,int has,int is4,int is8,int lim,int st){
    if(is4&&is8) return 0;
    if(x==0) return has;
    if(~f[x][las][lasqr][has][is4][is8][lim][st]) return f[x][las][lasqr][has][is4][is8][lim][st];
    int Max=lim?a[x]:9,res=0;
    for(int i=0;i<=Max;i++)
        if(st==1) res+=DFS(x-1,i,las,has,is4(i==4),is8(i==8),lim&&(i==Max),st&&(i==0));
        else res+=DFS(x-1,i,las,has(las==lasqr&&las==i),is4(i==4),is8(i==8),lim&&(i==Max),st&&(i==0));
    return f[x][las][lasqr][has][is4][is8][lim][st]=res;
}
inline int solve(int n){
    m=0;memset(f,-1,sizeof(f));
    while(n){
        a[++m]=n%10;
        n/=10;
    }
    return DFS(m,-1,-1,0,0,0,1,1);
}
int L,R;
signed main(){
    scanf("%lld%lld",&L,&R);
    printf("%lld\n",solve(R)-solve(L-1));
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Luogu P4124 [CQOI2016]手机号码 题解
    • Describe
      • Solution
        • Code
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档