4521: [Cqoi2016]手机号码

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit:
303  Solved: 194
[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

12121284000 12121285550

Sample Output

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

HINT

Source

Solution

这种数据范围,一眼数位DP,但是不是特别的好搞...

F[i][j][0/1][0/1][0/1][0/1][0/1]表示位数为i,最高位为j,最高位连续两个是否是相同的,是否有连续3个相同的,是否有4,是否有8,前缀和原数前缀的大小关系

枚举这些东西....k1,k2,k3,k4,k5分别表示对应上述0/1

注意&启发:

1.数位DP一般采取预处理,后求和,这里数据范围直接处理非常方便,采用直接处理

2.注意范围$L<=10^{10}$默认10位做的话,不能直接计算Calc(R)-Calc(L-1),这里可以采取讨论,或者处理区间为开区间,计算Calc(R+1)-Calc(L)即可

3.注意状态的枚举,一些零碎的判断需要理清,否则会陷入泥潭(WA了无数,不知所措)

4.如果digit[]正序做更方便可以考虑正序处理,外加此题可以采取特殊的枚举方式

5.更深层次的了解了数位DP,但仍需更多的练习,总体来说,此题是个不错的题目,自己能想到的只是框架,实现仍有些差池

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long F[][][][][][][],l,r;
int p[],num;
long long cal(long long x)
{
memset(F,,sizeof(F));
long long ans=; int len=,digit[],a,b,c,d,e;
while(x){digit[++len]=x%; x/=;}
reverse(digit+,digit+len+);
F[][][][][][][]=;
for (int i=; i<=len-; i++)
for (int j=; j<=; j++)
for (int k1=; k1<=; k1++)
for (int k2=; k2<=; k2++)
for (int k3=; k3<=; k3++)
for (int k4=; k4<=; k4++)
for (int k5=; k5<=; k5++)
if (F[i][j][k1][k2][k3][k4])
for (int k=; k<=; k++)
{
if (k5 && (k>digit[i+])) continue;
if (k==j) a=; else a=;
if (k2==) b=(k1+a)==; else b=k2;
if (k3==) c=(k==); else c=k3;
if (k4==) d=(k==); else d=k4;
if ((c+d)==) continue;
if (k5 && (k==digit[i+])) e=; else e=;
F[i+][k][a][b][c][d][e]+=F[i][j][k1][k2][k3][k4][k5];
}
for (int i=; i<=; i++)
for (int k1=; k1<=; k1++)
for (int k3=; k3<=; k3++)
for (int k4=; (k4<=)&&(k4+k3<); k4++)
ans+=F[len][i][k1][][k3][k4][];
return ans;
}
int main()
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",cal(r+)-cal(l));
return ;
}

昨晚写了道数(S)位(W)DP,结果第二天期中数学(S)物理(W)血崩...虽然1个多月的课,就上了1/4不到...但心里不爽啊o_O

【BZOJ-4521】手机号码 数位DP的更多相关文章

  1. BZOJ 4521 CQOI 2016 手机号码 数位DP

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

  2. bzoj 4521 [ Cqoi 2016 ] 手机号码 —— 数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 数位DP,记录好多维状态: 写了半天,复杂得写不下去了,于是参考一下TJ... 练习简 ...

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

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

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

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

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

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

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

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

  7. BZOJ 4521 手机号码

    SB数位dp. 我的貌似要特判9999999999的情况. #include<iostream> #include<cstdio> #include<cstring> ...

  8. BZOJ 3329: Xorequ [数位DP 矩阵乘法]

    3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...

  9. BZOJ.3329.Xorequ(数位DP)

    题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...

随机推荐

  1. DataReader用法

    一.DataReader含义 DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象 ...

  2. ios开发--多台电脑共用一个开发证书的方法

    Xcode5 以前的操作步骤是: idp证书如何给另一台机子使用 先在原电脑上用Xcode->Windows->Organizer, 再点击Developer profile, 在其最下面 ...

  3. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  4. 金山快盘+TortoiseSVN构建版本控制仓库

    金山会盘+TortoiseSVN构建版本控制仓库 之前写过一篇文章介绍 如何利用花生壳和VisualSVN Server建立远程代码仓库,具体请参照: <如何利用花生壳和VisualSVN Se ...

  5. CodeSmith操作Access时字段的排序问题

    最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致. 首先在ACCESS数据库中建一个测试表Test,并添加ID.Na ...

  6. FineUI小技巧(1)简单的购物车页面

    起因 最初是一位 FineUI 网友对购物车功能的需求,需要根据产品单价和数量来计算所有选中商品的总价. 这个逻辑最好在前台使用JavaScript实现,如果把这个逻辑移动到后台C#实现,则会导致过多 ...

  7. Http概述(一)

    Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱. 这样用户在访问信息时就不用担心其完整性了. web服务端与服务器是如何通信的 Web ...

  8. lecture7-序列模型及递归神经网络RNN

    Hinton 第七课 .这里先说下RNN有recurrent neural network 和 recursive neural network两种,是不一样的,前者指的是一种人工神经网络,后者指的是 ...

  9. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  10. 关于iphone 6 ios8网站背景图片错乱的问题解决办法

    最近公司有个客户的网站用手机safari打开出现背景图片错乱,本来应该显示A图片的却显示B图片,网速越慢的情况下越容易出现这种问题,悲催的是这种情况只在iPhone 6上出现,并且不是一直这样,多刷新 ...