\(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] \] 标签:Digit,题解,CF54C,位数,开头,Law,dp From: https://www.cnblogs.com/Svemit/p/17654180.html