#sWDPybttg050305. 1589:不要 62

1589:不要 62

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自:HDU 2089

杭州人称那些傻乎乎粘嗒嗒的人为 6262(音:laoer)。

杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。

不吉利的数字为所有含有 446262 的号码。例如:623156231573418734188891488914 都属于不吉利号码。但是,6115261152 虽然含有 6622,但不是 6262 连号,所以不属于不吉利数字之列。

你的任务是,对于每次给出的一个牌照区间号 [n,m][n, m],推断出交管局今后又要实际上给多少辆新的士车上牌照了(即区间内不含 446262 的数字个数)。


输入格式

输入包含多组数据。每组数据一行两个整数 n,mn, m,如果遇到 n=0n=0m=0m=0 则输入结束。


输出格式

对于每组数据,输出一个整数,表示 [n,m][n, m] 中不含 446262 的数字个数。


样例

样例输入

1 100
0 0

样例输出

80

样例解释

[1,100][1,100] 中,不吉利的数字有:

  • 44 的数:4,14,24,34,4049,54,64,74,84,944,14,24,34,40\sim49,54,64,74,84,94,共 1919 个?
  • 6262 的数:6262,共 11 个。

注意 6464 含有 44 已计入,6262 单独。

经过统计,不吉利的数字共 1919(含 44+1+16262=20=20 个。

所以吉利的数字个数为 10020=80100 - 20 = 80


数据范围

对于全部数据:

  • 0<nm<1070 < n \le m < 10^7
  • 输入以 n=0,m=0n=0, m=0 结束

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 数位 DP 经典题。

状态设计:dp[pos][last]dp[pos][last] 表示处理到第 pospos 位,上一位数字是 lastlastlastlast090\sim 9,若前面全是前导零则 lastlast00 或特殊值,但这里前导零不影响限制,所以 lastlast 初值可取 00)时,满足条件的方案数。

转移条件:

  1. 当前位不能为 44
  2. 如果上一位 last=6last=6,则当前位不能为 22

记忆化:dp[pos][last]dp[pos][last]lastlast 表示上一位数字。

DFS 参数

  • pos:当前位;
  • last:上一位数字;
  • limit:是否受上限限制;
  • lead:是否前面全是前导零(可省略,因为 last=0 时表示前面全 0)。

当 pos 到达末尾时,返回 1。

转移时枚举当前位数字 dd00 到 (limit ? digit[pos] : 9):

  • 如果 d=4d=4,跳过;
  • 如果 last=6last=6d=2d=2,跳过;
  • 否则继续 DFS(pos+1, d, limit && d==digit[pos])。

初始化 last=0,且当 last=0 且 d=0 时,表示继续前导零,last 仍为 0。

最终答案为:calc(m) - calc(n-1)。

复杂度:状态数 O(位数×10)O(\text{位数} \times 10),可以快速计算。

注意:数字 00 是否算吉利?00 不含 446262,但车牌号一般没有前导零,且区间从正数开始,所以不影响。若 n=0n=0,需要单独考虑 00 是否计入。