409. P10704 救赎(Redemption)
不依赖 \(a_i \le 10^9\) 的做法。
设 \(b_x\) 为有多少个 \(i\) 使得 \(a_i = x\)。
设一个阈值 \(B\)。当 \(\frac{m}{a_i a_j} > B\) 时 \(a_i a_j < \frac{m}{B}\),可以直接枚举 \(a_i\) 和 \(a_j\) 然后利用 \(b\) 数组统计。这部分时间复杂度为 \(O(\frac{m}{B} \ln \frac{m}{B})\)。
当 \(\frac{m}{a_i a_j} \le B\) 时,统计 \(\left\lfloor\frac{m}{a_i a_j}\right\rfloor\) 之和可以转化为对于一个整数 \(k \in [1, B]\),有多少对 \((i, j)\) 满足 \(x \le \frac{m}{a_i a_j}\) 即 \(x \cdot a_i \cdot a_j \le m\)。可以排序后双指针统计。这部分时间复杂度为 \(O(nB)\)。
总时间复杂度为 \(O(\frac{m}{B} \ln \frac{m}{B} + nB)\)。取 \(B = 350\) 可以通过。