4521: [Cqoi2016]手机号码


Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 870  Solved: 505
[Submit][Status][Discuss]

Description


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

Input


输入文件内容只有一行,为空格分隔的2个正整数L,R。
10^10 < =  L < =  R < 10^11

Output


输出文件内容只有一行,为1个整数,表示满足条件的手机号数量。

Sample Input


 

Sample Output



样例解释
满足条件的号码: 12121285000、 12121285111、 12121285222、 12121285333、 12121285550

HINT


题解:


因为数位dp太弱了,再加上scoi喜欢考数位dp,这两天就在刷数位dp了。

然后刷到了这道神奇的题,让我们看看状态需要定义几维,f[i][p1][p2][4/8][three]  没错,五维。

表达的意思分别是第i位,第i + 1位数字是啥,第i +2位数字是啥,是否出现4 或者 8,是否之前出现过连续3个一样的。

实际上你会发现是八维,因为我把4 和 8 合在了一维,并且还要判断前导0,还有是否抵达上限。

然后4 /8 合在一起判断 降下一维。

这道题保证所有合法数为11位且第一位不为0,可以不用判断前导0,降下一维;

然后上限什么的在记搜过程中判断就好了,降下一维。

然后就剩五维了。

需要注意的是因为手机号码是11位数,但我们在L = 10^10方时,用 R - (L - 1)会发现(L-1) 变成了10位数,特判一下就好了。

神奇的八维数位dp

AC代码:


# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
LL f[][][][][],L,R;int len,data[];
LL dfs(int now,int p1,int p2,bool fr,bool et,bool three,bool lim)
{
if(fr && et)return ;
if(!now)return three;
if(!lim && f[now][p1][p2][fr + et * ][three] != -)return f[now][p1][p2][fr + et * ][three];
LL ret = ;int p = lim ? data[now] : ;
for(int i = now == len;i <= p;i++)
ret += dfs(now - ,i,p1,fr || i == ,et || i == ,three || (i == p1 && i == p2),lim && i == p);
if(!lim)f[now][p1][p2][fr + et * ][three] = ret;
return ret;
}
LL calc(LL k)
{
memset(f,-,sizeof f);
len = ;
while(k)
{
data[++len] = k % ;
k /= ;
}
if(len < )return 0LL;
return dfs(len,,,,,,);
}
int main()
{
scanf("%lld %lld",&L,&R);
printf("%lld",calc(R) - calc(L - ));
}

[Bzoj4521][Cqoi2016]手机号码(数位dp)的更多相关文章

  1. [BZOJ4521][CQOI2016]手机号码(数位DP)

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 875  Solved: 507[Submit][Status ...

  2. [bzoj4521][Cqoi2016][手机号码] (数位dp+记忆化搜索)

    Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号 码单 ...

  3. 【BZOJ-4521】手机号码 数位DP

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 303  Solved: 194[Submit][Status ...

  4. [CQOI2016]手机号码 数位DP

    [CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...

  5. [Luogu P4124] [CQOI2016]手机号码 (数位DP)

    题面 传送门:洛咕 Solution 感谢神仙@lizbaka的教学 这题是数位DP的非常非常模板的题目,只是状态有点多 . 这题我使用记忆化搜索实现的 中国有句古话说的好,有多少个要求就设多少个状态 ...

  6. BZOJ 4521 [CQOI2016]手机号码 - 数位DP

    Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...

  7. bzoj 4521 [Cqoi2016]手机号码——数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 dfs真好用~ #include<iostream> #include&l ...

  8. BZOJ4521 Cqoi2016 手机号码 【数位DP】

    Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出 ...

  9. [BZOJ4521][Cqoi2016]手机号码 (数位dp)

    题目描述 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出售.为了便于前 ...

随机推荐

  1. ES5函数新增的方法(call、apply、bind)

    1.call()的使用<script type="text/javascript"> var obj1 = { name:'bob', fn:function(){ c ...

  2. 解决异常System.Runtime.Interopservices.COMException RequestLock问题

    工具——导入导出设置,重置调试设置就可以了,这是调试文件的异常

  3. Two-Phase Commit (2PC)

    两阶段提交模式像极了比赛发令:“预备,开始!”

  4. Vue构建命令

    node -v npm -v vue -V npm install vue (这个命令不行) 提示信息:+ vue@2.6.10 updated 1 package and audited 1 pac ...

  5. rfcn讲解博客

    http://www.cnblogs.com/lillylin/p/6277094.html ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'(W'和H'是ROI的 ...

  6. mybaits2-Dao开发

    项目结构: 1.创建project,导入相关依赖(前提).配置db.properties与mybaits-config #mysql驱动 db.driver=com.mysql.jdbc.Driver ...

  7. vue 父子组件的加载顺序

    一.加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount ...

  8. 组管理命令--groupadd.groupmod.groupdel.gpasswd

    添加用户组 格式 groupadd [参数] 组名 参数选项 -g GID:指定新组的GID,默认值是已有的最大的GID加1.-r:建立一个系统专用组,与-g不同时使用时,则分配一个1-499的GID ...

  9. 6 SQL 函数、谓词、CASE表达式

    6 函数.谓词.CASE表达式 6-1 各种各样的函数 /* 所谓函数,就是输入某一值得到相应输出结果的功能.输入值称为参数(parameter),输出值称为返回值. 函数大致可以分为以下几种 : 算 ...

  10. metasploitable2更改root密码

    metasploitable2这个系统众所周知,一个用户名和密码是msfadmin.但是这个账号权限不全,我们想要改root密码来登陆为所欲为.也没试过破解,咱们索性就改了吧. 就简单几行代码..   ...