CF54C First Digit Law 题解

发布时间 2023-08-24 15:10:35作者: Svemit

题目传送门

\(Solution\)

一个比较简单的数位 dp处理技巧加上一个暴力的 dp。

\(p_i\) 为区间 \([l_i, r_i]\) 中出现 \(1\) 开头的数的概率。

考虑 \(solve(x)\) 函数为求出 \([1, x]\) 中开头为 \(1\) 的个数。

显然低于 \(x\) 的位数的数是全部能取到的,这时候开头为 \(1\) 的个数有 \(\sum_{i=1}^{len - 1} 10^{i-1}\) 个,再考虑位数等于 \(x\) 的位数的数。

如果 \(x\) 的开头大于 \(2\) 的话,显然这一位的是可以全部取到的,小于 \(2\) 的话就加上 \(x - 10^{len - 1} + 1\) 即可。

算出概率后就可以直接 dp 了。

\(f[i][j]\) 为前 \(i\) 个区间有 \(j\)\(1\) 开头的数的概率。

显然有方程:

\[f[i][j] = f[i-1][j] \times (1-p[i]) + f[i-1][j-1] \times p[i] \]

代码