ZR2495 题解

题意

给定 \(n\) 和正整数序列 \(a_1,a_2,\dots,a_n\)。有 \(q\) 次询问,每次给定 \(l,r\),求

\[\left(\sum_{l\le i<j\le r}\gcd(a_i,a_j)\right)\bmod 2^{32} \]

\(1\le n,q\le 2.5\times10^5,1\le a_i\le n\)

题解

很强的一题,然而初三的巨佬 \(4\texttt{h}\) 场切了……我订正都不止这个时间……太弱小了,没有力量!

此题有一档很大的部分分为 \(a_i\) 随机。正解从这里下手。

首先将 \(\gcd(x,y)\) 化为 \(\sum\limits_{d|x,y}\varphi(d)\)。那么容易用莫队做到 \(O(n\sqrt q d)\),其中 \(d\) 为约数个数的期望,随机时为 \(\log n\)

\(\log\) 是瓶颈,于是考虑二次离线。对于每个前缀,有 \(f_i=cnt_i\varphi(i)\),其中 \(cnt_i\) 表示前缀中是 \(i\) 的倍数的数的数量。所求 \(g_x=\sum\limits_{d|x}f_x\)。考虑动态维护 \(g\),查询便是 \(O(1)\)

算一下复杂度。对于每个 \(d\),其倍数出现次数的期望为 \(\frac{n}{d}\),则计算次数为 \(\frac{n^2}{d^2}\)\(d\) 很小时复杂度很大,于是根号分治,对于 \(d\le\sqrt n\),可以暴力算贡献;对于 \(d>\sqrt n\),采用上述方法。\(\sum\limits_{i=\sqrt n}^n \frac{n^2}{i^2}=n\sqrt n\),于是总复杂度为 \(O(n\sqrt n)\)

接下来考虑 \(a_i\) 不随机的情况。用类似上面的方法,设 \(d\) 的倍数的出现次数为 \(c_d\),要算 \(\frac{c_d}{d}n\) 次。于是我们考虑将 \(\frac{c_d}{d}\) 最大的 \(T\)\(d\) 拿出来暴力算贡献,剩下部分二次离线。复杂度不太会算,但经过尝试,\(T\)\(800\) 时,复杂度为 \(O(\text{可过})\)

另外,此题可以训练卡常技巧与耐心

posted @ 2023-03-07 10:18  realFish  阅读(21)  评论(0)    收藏  举报