T1

题面

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

的值,其中(nleq5 imes10^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} floor}sum_{y=1}^{lfloor{frac{n}d} floor}f(x imes d)f(y imes d) ]

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

[sum_{d=1}^{n}(sum_{x=1}^{lfloor{frac{n}d} floor}f(x imes d))(sum_{x=1}^{lfloor{frac{n}d} floor}f(x imes d)) ]

[=sum_{d=1}^{n}(sum_{x=1}^{lfloor{frac{n}d} floor}f(x imes d))^2 ]

注意是先求和再平方

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

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

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

int - > long long 0 - > 100
原文地址:https://www.cnblogs.com/anyixing-fly/p/13662721.html