T1

题面

\[\sum_{i=1}^{n}\sum_{j=1}^{n}f(i)f(j)f(gcd(i,j)) \]

的值,其中\(n\leq5\times10^7 \ f(i)\)表示\(i\)的约数个数。

直接推式子,根据约数个数的定义,有

\[f(gcd(i,j))=\sum_{d|gcd(i,j)}1 \]

这一步枚举约数,一个约数贡献答案一

然后把右边的式子继续拆开,如果一个数能整除两个数的\(gcd\)那么它一定也能整除这两个数,于是

\[\sum_{d|gcd(i,j)}1=\sum_{d|i,d|j}1 \]

然后原式子就化为

\[\sum_{i=1}^{n}\sum_{j=1}^{n}f(i)f(j)\sum_{d|i,d|j}1 \]

发现这里\(d\)的选择受到\(i\)\(j\)的限制,反过来说\(d\)也能限制\(i\)\(j\)的选择,那么肯定是选限制多个的那个数去枚举,所以可以直接枚举\(d\),那么就有

\[\sum_{d=1}^{n}\sum_{d|i,d|j}f(i)f(j) \]

这里枚举\(i\)\(j\)的时候肯定不能\(O(n)\)的枚举因子,所以换一个角度枚举倍数,得到

\[\sum_{d=1}^{n}\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}\sum_{y=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d)f(y\times d) \]

然后又发现\(x\)\(y\)的枚举实际上是一样的,合并之后可以得到

\[\sum_{d=1}^{n}(\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d))(\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d)) \]

\[=\sum_{d=1}^{n}(\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d))^2 \]

注意是先求和再平方

这个式子直接做的话是\(O(nlogn)\)的,调和级数。

时间复杂度的瓶颈主要是在统计这个前缀和上边,如果能想办法优化掉它就很好了。

类似高维前缀和,可以由这样一个性质统计出来,就是对于一个数,如果它能为后边的某个数的前缀和做贡献,那么它分解质因子之后各位上的次幂一定是不会有大于那个数的,根据这个统计一下前缀和即可。

posted @ 2020-09-13 19:30  An_Fly  阅读(192)  评论(6编辑  收藏  举报