给定 \(n, k\) 与序列 \(a_1,. . . , a_n\),求满足 \(\prod_{i=1}^{n}{b_i \geq k}\) 的正整数序列 \(b_1,. . . , b_n\) 的 \(\prod_{i=1}^{n}{\lfloor \frac{a_i}{b_i} \rfloor}\) 的最大值。
数据范围:\(1 \leq n \leq 100, 1 \leq k \leq 10^7, 1 \leq a_i \leq 10^7\)
- 首先考虑暴力 \(dp\),容易想到背包的做法
- 即设 \(dp_{i,j}\) 表示前 \(i\) 个元素,\(b_i\) 的乘积为 \(j\) 的答案乘积
- 这显然不可行,太暴力了
- 我们发现这么列其实是有很多浪费的
- 考虑假设我们把 \(b\) 序列分为前后两部分,前面的 \(b_i\) 的乘积设为 \(k_1\),那么后面要求的限制条件即 \(\prod b_i \geq \lfloor \frac{k}{k_1} \rfloor\)
- 发现到右面这个东西下降非常迅速,因此我们魔改一下背包的做法
- 设 \(dp_{i,j}\) 表示剩下 \(n-i\) 个元素的乘积要 \(\geq j\) 时前 \(i\) 个元素的答案之积
- 虽然说 \(j\) 的下降非常迅速,但我们并没有准确量化这个下降到底有多 "迅速",因此我们可以来计算一下
- 当每向后 \(dp\) 一位,\(\large{ j \leftarrow \lceil \frac{j}{b_i} \rceil = \lceil \frac{k}{\prod b_i} \rceil }\),而根据整除分块的理论,后面这个东西的取值最多只有 \(\sqrt k\) 种,因此 \(dp\) 实际用到的位置为 \(n \sqrt k\)
- \(dp\) 的转移式为 \(dp_{i, \lceil \frac{j}{b_i} \rceil} \leftarrow dp_{i-1,j} \times \lfloor \frac{a_i}{b_i} \rfloor\)
- 如果我们继续对 \(a_i\) 进行整除分块,以求得 \(b_i\),那么转移一次的复杂度为 \(O(\sqrt a_i)\) 这是我们无法接受的
- 因此我们可以另辟蹊径:选择 \(j\) 进行整除分块
- 注意到 \(j\) 本来就下降的很快,而对他进行整除分块的话可以获得一个更快的复杂度,我们可以来计算一下:
- 这里的估算需要用到微积分相关知识,想要了解的可以上网搜索
- 因此最后的复杂度就压缩到了 \(O(nk^{\frac{3}{4}})\),可以通过
- 这道题使用了两次整除分块相关知识,并且第二次的选择十分巧妙,值得学习