[Edu Round 177] E. Zebra-like Numbers
前言
做做做
思路
首先分析题目, 得到我们应该首先分析一个数的斑马值 \(p\) 的计算方式
找点性质, 对一些数 \(x\) 求斑马值
发现
- \(x\) 的二进制位上, 只有偶数位可能是 \(1\)
不难发现问题转化成二进制数的偶数位上的 \(1, 0\) 极长段个数
现在考虑如何计算 \(x \in [l, r]\) 中斑马值为 \(k\) 的数的个数
不妨先把 \(l, r\) 转化成二进制, 然后考虑其约束
发现可以转化为这样一个问题
求区间 \([l, r]\) 中, 二进制位上 \(1, 0\) 极长段个数等于 \(k\) 的数的个数
这个理论上是可以用数位 \(\rm{dp}\) 解决的, 但是我不会, 于是看下题解
发现忘了数据检验导致甲烷了
就算偶数位上有 \(1\), 我们可以通过进位的方法构造
考虑斑马数集合 \(\mathbb{P} = \{z_1, z_2, z_3, \cdots\}\)
不难发现 \(z_1 = 1\), \(z_i = 4z_{i - 1} + 1\)
于是可以认为其数量是 \(\log V\) 级别的, 约为 \(31\) 个
但是这个有什么用呢?
考虑一个数 \(x\) 如何拆分, 不难猜测可以贪心的从大到小拆分, 这个是正确的\((\)具体证明\()\)
因此我们把拆分视作一个新的数字系统
问题已经简化为计算区间 \([l,r]\) 中数字的数量, 使得这些数字在斑马数系统中的数字之和等于 \(x\), 这个显然是可以用斑马数系统中的数位 \(\rm{dp}\) 处理的, 注意每一位上的取值在 \(0 \sim 4\) 之间, 并且如果有一个位置是 \(4\), 那么后面的位置都是 \(0\)
发现这类问题还是需要好好搞得, 重来
首先考虑斑马数集合 \(\mathbb{P} = \{z_1, z_2, z_3, \cdots\}\)
不难发现 \(z_1 = 1\), \(z_i = 4z_{i - 1} + 1\)
于是可以认为其数量是 \(\log V\) 级别的, 约为 \(31\) 个
分析性质: 一个数 \(x\) 如何被拆分使得拆分出的个数最少
不难想到可能是贪心从大权值到小权值贪心选
考虑证明
于是定义「斑马数字系统」, 其中每一位 \(S_i\) 表示 \(z_i\) 的个数, \(S_i \in \{0, 1, 2, 3, 4\}\)
也就是说, 我们简单地把 \(l, r\) 转化到斑马数字系统, 然后做数字和的数位 \(\rm{dp}\) 即可
注意两点
- 前导零无关
- 假设当前 \(z_i\) 选了 \(4\) 个, 那么 \(z_{j < i}\) 就不要选了
这个通过从高位到低位做数位 \(\rm{dp}\) 来保证, 前面的选了一个 \(4\), 后面的不选了
具体为什么: 如果放了 \(4z_i\), 在 \(z_i\) 之前, 保证了到达 \(z_i\) 的时候 \(x < z_{i + 1}\), 也就是 \(x < 4z_i + 1\), 那么显然后面一点都不会剩下
总结
什么男人我说, 数据检验!
转化为新的数字系统然后数位 \(\rm{dp}\) 解决, 一类问题


浙公网安备 33010602011771号