Loading

【题解】IOI 2022 集训队互测 Day3 T1 Lovely Dogs

题目传送门

\(50\) 分基本是白给的。现在来讨论 Subtask 5,也就是说求:

\[\sum_{i=1}^{n}\sum_{j=1}^{n}f_d(ij) \]

注意到如果令 \(g(i)\) 表示 \(\prod (-1)^{k_i}\),那么有 \(f_d(ij)=g(i)g(j)f_d(ij)^2\) 。此时令 \(h(i)\) 表示最大的 \(t\) 满足 \(t^{d+1}|i\),那么可以发现 \(f_{d}(ij)^2=[h(ij)=1]=\sum\limits_{k|h(ij)}\mu (k)=\sum\limits_{t^{d+1}|ij}\mu (t)\)

此时考虑插入一个数怎么更新,具体考虑插入 \(r\),那么带来的影响有:

\[\sum_{l=1}^{r}f_d(lr)=g(r)\sum\limits_{t}\mu (t)\sum_{l=1}^{r}g(l)\left[\frac{t^{d+1}}{\gcd (t^{d+1},r)}|l\right] \]

此时考虑 \(t\) 的枚举范围,如果 \(t\not\mid r\) 的话,那么能够满足 \(t^{d+1}|lr\) 就一定存在质数 \(p\) 使得 \(p^{d+1}|l\),那么此时 \(f_d(lr)\) 必然为 \(0\),不需要考虑。

这样插入一个数的时候就只需要考虑其因数作为 \(t\),然后求出 \(\frac{t^{d+1}}{\gcd (t^{d+1},r)}\) 后考虑 \(l\) 即可(每个 \(l\) 都放在其的每个因处)。那么我们就得到了 \(O(n\ln n)\) 的做法,关键思路就是重写给定函数然后用莫比乌斯函数代替,最后找一下性质干掉无用情况。

顺带提一句,莫比乌斯函数有个性质是 \(\mu(ij)=\mu(i)\mu(j)\mu(ij)^2\) 。说白了上述的 \(f_d(ij)=g(i)g(j)f_d(ij)^2\) 其实就是将这个改写了一下得到的。

接下来考虑上树,注意到删除加入一个点的代价都是其因数个数个,直接莫队的话因为询问区间左端点不重复,最后每个点操作的次数都是 \(O(\sqrt{n})\),那么总复杂度就是 \(O(n\ln n\sqrt{n})\)

接着考虑能不能做到更优,具体考虑链分治。每次继承重子树贡献,重新计算轻子树的贡献,然后加入自身的贡献。那么每一个点的加入次数是 \(O(\log n)\) 的,因此总复杂度为 \(O(n\ln n\log n)\)

我认为本题前 50 分和后 50 分之间的关键突破点在于怎么重写 \(f_d(x)\) 使其变得更加好计算,得出上面的贡献计算式后,接下来的无论是莫队还是链分治都很自然并且很简单了。

其实对于这类问题(最后转化成了倍数或者因数做贡献,总复杂度就变成了 \(O(n\ln n)\)),基本都会限制 \(a_i\) 是排列。这点给我们的启发就是看到这种排列性质的话,如果又是这种数论题,那么可以想想是不是和倍数因数有关。

posted @ 2021-10-26 15:19  Qiuly  阅读(822)  评论(0编辑  收藏  举报