Codeforces 1513C - Add One
条评论题意
有$t$组询问,每组询问给出两个数字$n$和$m$,求出数字$n$经过$m$次操作之后的长度。
长度对$1e9+7$取模。
每次操作会使得数字$n$的每个数位都$+1$,且不存在进位,下面给出两个例子:
思路
看到这一题,联想到早年写的牛客某题(两道不错的线性筛题目记录 | YZ_HL’s Blog)。
想着会不会也是类似的维护方式,开两个数组,一个记录长度,一个记录取模后的值。
后面发现,取模后的值会影响长度的计算。一时间陷入死循环。
这个时候再回去看看题。嗯,发现看错了,不需要求出具体的数取模后的结果,而是数字长度。
那么这个就简单了。在没有进位的情况下,每个数字对长度的贡献是独立的。
那么问题转化为求每个数字的贡献。
我们可以发现,当前数字为$num$时,经过$10-num$次操作,可以变成$10$,此时,又可以分解为$1$和$0$两个子问题。
因此,我们可以设$dfs(num,m)$,$num$为当前数字,$m$为当前剩余的操作数。
转移时,若$m >= 10 - num$:
$dfs(num, m) = dfs(1, m - (10 - num)) + (0, m - (10 - num))$
否则,直接$dfs(num, m)=1$,长度不会发生改变。
这样,我们就只需要考虑长度为$1$的问题,和$10$这个特殊的子问题,就可以求解了。
后面学习题解发现,只需要维护$10$开始,经过$m$次操作,数字的长度$dp[m]$就可以了,不需要像我那样那么复杂。
代码
1 |
|
End
啊,头一次知道原来$Codeforces$还会告诉你哪里溢出了,麻了。