CF1553F Solution
首先显然地 \(\displaystyle p_i=p_{i-1}+\sum_{j=1}^{i-1}a_j\bmod a_i+\sum_{j=1}^{i-1}a_i\bmod a_j\)。那么两部分分开来算。
\(\displaystyle \sum_{j=1}^{i-1}a_j\bmod a_i\):
我们知道 \(x\bmod y=x-y\lfloor\frac x y\rfloor\),那么我们先把答案加上 \(\sum a_j\) 再减去 \(\sum a_i\lfloor\frac{a_j}{a_i}\rfloor\)。
现在来计算 \(\sum a_i\lfloor\frac{a_j}{a_i}\rfloor\)。
注意到我们有 \(a\) 互不相同的条件,因此直接枚举 \(a_i\) 的倍数复杂度是不会爆的。
于是枚举 \(k\) 使得 \(ka_i\le m(m=\max\{a\})\),我们知道 \(\forall a_j\in[ka_i,(k+1)a_i)\) 有 \(\lfloor\frac{a_j}{a_i}\rfloor=k\)。
也就是说这些 \(a_j\) 对答案的贡献均为 \(ka_i\)。
那么就好办了。用一个权值树状数组维护前面的 \(a\) 序列的元素,枚举 \(k\) 以后把答案减去在 \([ka_i,(k+1)a_i)\) 内的元素个数乘上 \(ka_i\)。
这样做是 \(\mathcal O(n\log^2m)\) 的。
\(\displaystyle \sum_{j=1}^{i-1}a_i\bmod a_j\):
同样地先把答案加上 \((i-1)a_i\) 再减去 \(\sum a_j\lfloor\frac{a_i}{a_j}\rfloor\)。
观察 \(\sum a_j\lfloor\frac{a_i}{a_j}\rfloor\),注意到 \(a_j\lfloor\frac{a_i}{a_j}\rfloor\) 可以表示为 \(\lfloor\frac{a_i}{a_j}\rfloor\) 个 \(a_j\) 的和。
如何体现 \(\lfloor\frac{a_i}{a_j}\rfloor\) 呢?考虑一个长为 \(a_i\) 的数组,每逢下标为 \(a_j\) 的倍数的地方加上 \(a_j\),那么一共加上的数和就恰好是 \(a_j\lfloor\frac{a_i}{a_j}\rfloor\)。
那么就好办了:我们把上述的数组大小延长至 \(m\) 并用权值树状数组维护,每次减去的就是查询 \(a_i\) 处的前缀和。
然后我们枚举 \(a_i\) 的倍数,把这些位置的值加上 \(a_i\)。
这样做仍是 \(\mathcal O(n\log^2m)\) 的。
最后复杂度 \(\mathcal O(n\log^2m)\)。
标签:lfloor,ka,frac,sum,solution,rfloor,cf1553f,bmod From: https://www.cnblogs.com/iorit/p/18040107