题解:P2602 [ZJOI2010] 数字计数
这个题一眼小学奥数,为什么要用数位 dp?
注意到:
- 百位数字一定时十位数字
出现次数为 ; - 十位数字一定时个位数字
出现次数为 ; - 则有
所以可以用
注意到相关限制来自三个原数字位置:
if (d < cur),则可以随便填,对于更高位上可能数字,都有 可以选择,而对应的以 为最高位的个数又是 ,则有 ans[d] += (pre + 1) * scale;if (d == cur),那么在更高位可能数字的时候,包含当前位的较低位数字个数就变成了 个(包含后缀零),则有 ans[d] += pre * scale + suf + 1;if (d > cur),那么更高位数字而较低位数字也不会有限制,则有 ans[d] += pre * scale;
关于前导零,显然只有最高位会担心这个事情,且此时后缀数字随意填充,所以减去其对应的
基于此,我方代码如下:
1 |
|
- Title: 题解:P2602 [ZJOI2010] 数字计数
- Author: Firsry
- Created at : 2025-08-09 22:16:49
- Updated at : 2025-08-10 09:29:21
- Link: https://firsryfan.github.io/2025/08/09/题解:P2602-ZJOI2010-数字计数/
- License: This work is licensed under CC BY-NC-SA 4.0.