请统计某个给定范围[L,R]的所有整数中,数字2出现的次数
时间: 2023-06-11 17:10:26 浏览: 157
统计每个整数的出现次数
3星 · 编辑精心推荐
我们可以使用数位DP(动态规划)的思想来解决这个问题。具体来说,我们考虑枚举当前处理的位置(从高到低),以及已经确定的前缀数字,然后根据前缀数字的大小关系,分三种情况讨论:
1. 前缀数字小于当前位置的数字,则当前位置可以取任意数,不会对2的出现次数造成影响;
2. 前缀数字等于当前位置的数字,则当前位置既可以取0到1,也可以取3到9,但是当当前位置取2时,会对2的出现次数造成影响,我们需要计算这种情况下的贡献;
3. 前缀数字大于当前位置的数字,则当前位置不能取2,不会对2的出现次数造成影响。
具体实现时,我们可以用一个三维数组 $dp_{i,j,k}$ 表示当前处理到第 $i$ 位,前缀数字为 $j$,且是否有数字 $k$ 出现过的方案数。其中,$k=0$ 表示没有数字2出现过,$k=1$ 表示至少有一次数字2出现过。根据上述三种情况,我们可以得到转移方程:
$$
dp_{i,j,k}=dp_{i+1,j,0}+\sum_{d=0}^9dp_{i+1,j\ge d,[k=1\text{ or }d=2]}\\
\text{其中,}[x]=\begin{cases}1,&\text{x为真}\\0,&\text{x为假}\end{cases}
$$
最终的答案为 $dp_{1,0,1}$。
时间复杂度为 $O(\log R)$。
下面是Python代码实现:
阅读全文